*08.1* 分割窗口 打開新窗口最簡單的命令如下: :split 這個命令把屏幕分解成兩個窗口并把光標置于上面的窗口中: +----------------------------------+ |/* file one.c */ | |~ | |~ | |one.c=============================| |/* file one.c */ | |~ | |one.c=============================| | | +----------------------------------+ 你可以看到顯示同一個文件的兩個窗口。帶 "====" 的行是狀態條,用來顯示它上面的窗 口的信息。(在實際的屏幕上,狀態條用反色顯示) 這兩個窗口允許你同時顯示一個文件的兩個部分。例如,你可以讓上面的窗口顯示變 量定義而下面的窗口顯示使用這些變量的代碼。 CTRL-W w 命令可以用于在窗口間跳轉。如果你在上面的窗口,它會跳轉到下面的窗口, 如果你在下面的窗口,它會跳轉到上面的窗口。(CTRL-W CTRL-W 可以完成相同的功能這 是為了避免你有時按第二次的時候從 CTRL 鍵上縮手晚了。) 關 閉 窗 口 以下命令用于關閉窗口: :close 實際上,任何退出編輯的命令都可以關閉窗口,象 ":quit" 和 "ZZ" 等。但 "close" 可 以避免你在剩下一個窗口的時候不小心退出 Vim 了。 關 閉 所 有 其 它 窗 口 如果你已經打開了一整套窗口,但現在只想編輯其中一個,如下命令可以完成這個功能: :only 這個命令關閉除當前窗口外的所有窗口。如果要關閉的窗口中有一個沒有存盤,Vim 會顯 示一個錯誤信息,并且那個窗口不會被關閉。
*08.2* 用另一個文件分割窗口 下面命令打開另一個窗口并用該窗口編輯另一個指定的文件: :split two.c 如果你在編輯 one.c,則命令執行的結果是: +----------------------------------+ |/* file two.c */ | |~ | |~ | |two.c=============================| |/* file one.c */ | |~ | |one.c=============================| | | +----------------------------------+ 要打開窗口編輯一個新文件,可以使用如下命令: :new 你可以重復使用 ":split" 和 ":new" 命令建立任意多的窗口。
*08.3* 窗口大小 :split 命令可以接受計數前綴。如果指定了這個前綴,這個數將作為窗口的高度。例如 如下命令可以打開一個三行的窗口并編輯文件 alpha.c: :3split alpha.c 對于已經打開的窗口,你可以用有幾種方法改變它的大小。如果你有鼠標,很簡單:把鼠 標指針移到分割兩個窗口的狀態欄上,上下拖動即可。 要擴大窗口: CTRL-W + 要縮小窗口: CTRL-W - 這兩個命令接受計數前綴用于指定擴大和縮小的行數。所以 "4 CTRL-W +" 會使窗口增高 4 行。 要把一個窗口設置為指定的高度,可以用這個命令: {height}CTRL-W _ 就是先輸入一個數值,然后輸入 CTRL-W 和一個下劃線 (在美式英語鍵盤中就是 Shift 加上 "-")。 要把一個窗口擴展到盡可能大,可以使用無計數前綴的 CTRL-W _ 命令。 使 用 鼠 標 在 Vim 中,你可以用鍵盤很快完成很多工作。但很不幸,改變窗口大小要敲不少鍵。在 這種情況下,使用鼠標會更快一些。把鼠標指針移到狀態條上,按住左鍵并拖動。狀態條 會隨之移動,這會使一個窗口更大一個更小。 選 項 'winheight' 選項設置最小的期望窗口高度而 'winminheight' 選項設置最小的 "硬性" 高度。 同樣,'winwidth' 設置最小期望寬度而 'winminwidth' 設置最小硬性寬度。 'equalalways' 選項使所有的窗口在關閉或者打開新窗口的時候總保持相同大小。
*08.4* 垂直分割 ":split" 命令在當前窗口的上面建立窗口。要在窗口左邊打開新窗口,用這個命令: :vsplit 或者 :vsplit two.c 這個命令的結果如下: +--------------------------------------+ |/* file two.c */ |/* file one.c */ | |~ |~ | |~ |~ | |~ |~ | |two.c===============one.c=============| | | +--------------------------------------+ 實際中,中間的豎線會以反色顯示。這稱為垂直分割線。它左右分割一個窗口。 還有一個 "vnew" 命令,用于打開一個垂直分割的新窗口。還有一種方法是: :vertical new "vertical" 命令可以放在任何分割窗口的命令的前面。這會在分割窗口的時候用垂直分 割取代水平分割。(如果命令不分割窗口,這個前綴不起作用)。 在 窗 口 間 跳 轉 由于你可以用垂直分割和水平分割命令打開任意多的窗口,你就幾乎能夠任意設置窗口的 布局。接著,你可以用下面的命令在窗口之間跳轉: CTRL-W h 跳轉到左邊的窗口 CTRL-W j 跳轉到下面的窗口 CTRL-W k 跳轉到上面的窗口 CTRL-W l 跳轉到右邊的窗口 CTRL-W t 跳轉到最頂上的窗口 CTRL-W b 跳轉到最底下的窗口 你可能已經注意到這里使用移動光標一樣的命令用于跳轉窗口。如果你喜歡,改用方向 鍵也行。 還有其它命令可以跳轉到別的窗口,參見:|Q_wi|。
*08.5* 移動窗口 你已經分割了一些窗口,但現在的位置不正確。這時,你需要一個命令用于移動窗口。 例如,你已經打開了三個窗口,象這樣: +----------------------------------+ |/* file two.c */ | |~ | |~ | |two.c=============================| |/* file three.c */ | |~ | |~ | |three.c===========================| |/* file one.c */ | |~ | |one.c=============================| | | +----------------------------------+ 顯然,最后一個窗口應該在最上面。移動到那個窗口 (用 CTRL-W w) 并輸入如下命令: CTRL-W K 這里使用大寫的 K。這樣窗口將被移到最上面。你可以注意到,這里又用 K 表示向上移 動了。 如果你用的是垂直分割,CTRL-W K 會使當前窗口移動到上面并擴展到整屏的寬度。 假設你的布局如下: +-------------------------------------------+ |/* two.c */ |/* three.c */ |/* one.c */ | |~ |~ |~ | |~ |~ |~ | |~ |~ |~ | |~ |~ |~ | |~ |~ |~ | |two.c=========three.c=========one.c========| | | +-------------------------------------------+ 當你在中間的窗口 (three.c) 中使用 CTRL-W K 后,結果會是: +-------------------------------------------+ |/* three.c */ | |~ | |~ | |three.c====================================| |/* two.c */ |/* one.c */ | |~ |~ | |two.c==================one.c===============| | | +-------------------------------------------+ 還有三個相似的命令 (估計你已經猜出來了): CTRL-W H 把當前窗口移到最左邊 CTRL-W J 把當前窗口移到最下邊 CTRL-W L 把當前窗口移到最右邊
*08.6* 對所有窗口執行命令 你打開了幾個窗口,現在你想退出 Vim,你可以分別關閉每一個窗口。更快的方法是: :qall 這表示 "quit all" (全部退出)。如果任何一個窗口沒有存盤,Vim 都不會退出。同時光 標會自動跳到那個窗口,你可以用 ":write" 命令保存該文件或者 ":quit!" 放棄修改。 如果你知道有窗口被改了,而你想全部保存,則執行如下命令: :wall 這表示 "write all" (全部保存)。但實際上,它只會保存修改過的文件。Vim 知道保存 一個沒有修改過的文件是沒有意義的。 另外,還有 ":qall" 和 "wall" 的組合命令: :wqall 這會保存所有修改過的文件并退出 Vim 。 最后,下面的命令由于退出 Vim 并放棄所有修改: :qall! 注意,這個命令是不能撤消的。 為 所 有 的 參 數 打 開 窗 口 要讓 Vim 為每個文件打開一個窗口,可以使用 "-o" 參數: vim -o one.txt two.txt three.txt 這個結果會是: +-------------------------------+ |file one.txt | |~ | |one.txt========================| |file two.txt | |~ | |two.txt========================| |file three.txt | |~ | |three.txt======================| | | +-------------------------------+ "-o" 參數用于垂直分割窗口。 如果 Vim 已經啟動了,可以使用 ":all" 命令為參數列表中的每個文件打開一個窗 口。":vertical all" 以垂直分割的方法打開窗口。
*08.7* 用 vimdiff 顯示文件差異 有一種特殊的啟動 Vim 的方法可以用來顯示兩個文件的差異。讓我們打開一個 "main.c" 并插入一些字符。在設置了 'backup' 選項的情況下保存這個文件,以便產生 "main.c~" 備份文件。 在命令行中輸入如下命令:(不是在 Vim 中) vimdiff main.c~ main.c Vim 會用垂直分割的方式打開兩個文件。你只能看到你修改過的地方和上下幾行的地方。 VV VV +-----------------------------------------+ |+ +--123 lines: /* a|+ +--123 lines: /* a| <- 折疊 | text | text | | text | text | | text | text | | text | changed text | <- 修改過的行 | text | text | | text | ------------------| <- 刪除的行 | text | text | | text | text | | text | text | |+ +--432 lines: text|+ +--432 lines: text| <- 折疊 | ~ | ~ | | ~ | ~ | |main.c~==============main.c==============| | | +-----------------------------------------+ (這幅圖沒有顯示出高亮效果,可以使用 vimdiff 命令看到更好的效果) 那些沒有修改的行會被折疊成一行,這稱為 "關閉的折疊" (closed fold)。上圖中 由 "<- 折疊" 標記的行就是一個用一行表示 123 行的折疊。這些行在兩個文件中完全相 同。 標記為 "<- 修改過的行" 被高亮顯示,而增加的行被用另一種顏色表示。這可以很 清楚地表示出兩個文件間的不同。 被刪除的行在 main.c 窗口中用 "---" 顯示,如圖中用 "<- 刪除的行" 標記的行。 這些字符并不是真的存在。它們只是用于填充 main.c,以便與另一個窗口對齊。 折 疊 欄 每個窗口在左邊都有一個顏色略有不同的顯示欄,圖中標識為 "VV"。你會發現每個折疊 在那個位置都有一個加號。把鼠標移到那里并按左鍵可以打開那個折起,從而讓你看到里 面的內容。 對于打開的折疊,折疊欄上會出現一個減號。如果你單擊那個減號,折疊會被重新關 閉。 當然,這只能在你有鼠標的情況下使用。如果你沒有,可以用 "zo" 打開一個折疊。 關閉使用 "zc"。 用 Vim 做 比 較 啟動比較模式的另一種方法從 Vim 內部開始:編輯 "main.c" 文件,然后分割窗口顯示 區別: :edit main.c :vertical diffsplit main.c ":vertical" 命令使窗口用垂直的方式分割。如果你不寫這個命令,結果會變成水平分 割。 如果你有一個當前文件的補丁或者 diff 文件,你可以用第三種方法啟動比較模式:先編 輯這個文件,然后告訴 Vim 補丁文件的名稱: :edit main.c :vertical diffpatch main.c diff 警告:補丁文件中必須僅包括為一個目標文件所做的補丁,否則你可能會得到一大堆錯誤 信息。還可能有些你沒打算打補丁的文件也被打了補丁。 補丁功能只改變內存中的文件備份,不會修改你硬盤上的文件 (除非你決定寫入改 動)。 滾 動 綁 定 當文件中有很多改動時,你可以用通常的方式滾動屏幕。Vim 會盡可能保持兩個文件對 齊,以便你可以并排看到文件的區別。 如果暫時想關閉這個特性,使用如下命令: :set noscrollbind 跳 轉 到 修 改 的 地 方 如果你通過某種方法取消了折疊功能,可能很難找到有改動的地方。使用如下命令可以跳 轉到下一個修改點: ]c 反向跳轉為: [c 加上一個計數前綴可以跳得更遠。 消 除 差 異 你可以把文本從一個窗口移到另一個,并以此來消除差異,或者為其中一個文件中增加幾 行。Vim 有時可能無法及時更新高亮顯示。要修正這種問題,使用如下命令: :diffupdate 要消除差異,你可以把一個高亮顯示的塊從一個窗口移動到另一個窗口。以上面的 "main.c" 和 "main.c~" 為例,把光標移到左邊的窗口,在另一個窗口中被刪除的行的位 置,執行如下命令: :dp 這將把文字從左邊拷到右邊,從而消除兩邊的差異。"dp" 代表 "diff put"。 你也可以反過來做:把光標移到右邊的窗口,移到被 "改動" 了的行上,然后執行 如下命令: :do 這把文本從左邊拷到右邊,從而消除差異。 由于兩個文件已經沒有區別了,Vim 會把所有文字全部折疊起來。"do" 代表 "diff obtain"。本來用 "dg" (diff get) 會更好??墒撬呀浻辛硗獾囊馑剂?("dgg" 刪除從 光標為止到首行的所有文本)。 要了解更多的比較模式的內容,參見 |vimdiff|。
*08.8* 雜項 'laststatus' 選項用于指定什么時候對最后一個窗口顯示狀態條: 0 永遠不 1 只有用分割窗口的時候 (默認) 2 永遠有 很多編輯另一個文件的命令都有一個使用分割窗口的變體。對于命令行命令,這通過前置 一個 "s" 實現。例如 ":tag" 用來跳到一個標記,"stag" 就會分割出一個新窗口并跳到 那個標記。 對于普通模式,前置一個 CTRL-W 可以完成這個功能。例如,CTRL-^ 跳到輪換文 件,而 CTRL-W CTRL-^ 打開一個新窗口并編輯輪換文件。 'splitbelow' 選項可以讓新的窗口出現在當前窗口的下面。'splitright' 選項讓垂直分 割的窗口出現在當前窗口的右邊。 打開一個新窗口時可以在命令前加上一個修飾符說明新窗口應該出現在什么地方: :leftabove {cmd} 當前窗口的左上方 :aboveleft {cmd} 同上 :rightbelow {cmd} 當前窗口的右下方 :belowright {cmd} 同上 :topleft {cmd} 整個 Vim 窗口的最上面或者最左邊 :botright {cmd} 整個 Vim 窗口的最下面或者最右邊
*08.9* 標簽頁 你會注意到窗口永遠不會重疊。這意味著屏幕空間很快會用完。這個問題的解決方法叫做 標簽頁。 假設你正在編輯文件 "thisfile"。下面的命令可以建立新的標簽頁: :tabedit thatfile 這會在一個窗口中編輯文件 "thatfile",這個窗口會占滿整個 Vim 窗口。你會注意到在 頂部有一個含有兩個文件名的橫條: +----------------------------------+ | thisfile | /thatfile/ __________X| (thatfile 用加粗字體出現) |/* thatfile */ | |that | |that | |~ | |~ | |~ | | | +----------------------------------+ 現在,你擁有了兩個標簽頁。第一個是文件 "thisfile" 的窗口,第二個是文件 "thatfile" 的窗口。這就像是兩張重疊的紙,它們所帶的的標簽露在外面,顯示其文件 名。 現在,使用鼠標單擊頂端的 "thisfile"。結果是 +----------------------------------+ | /thisfile/ | thatfile __________X| (thisfile 用加粗字體出現) |/* thisfile */ | |this | |this | |~ | |~ | |~ | | | +----------------------------------+ 你可以通過單擊頂端的標簽切換標簽頁。如果沒有鼠標或者不想用它,可以使用 "gt" 命 令。助記符:Goto Tab。 現在,讓我們通過下面的命令建立另一個標簽頁: :tab split 這會建立一個新的標簽頁,包含一個窗口,編輯和剛才所在窗口中的緩沖區相同的緩沖 區: +-------------------------------------+ | thisfile | /thisfile/ | thatfile __X| (thisfile 用加粗字體出現) |/* thisfile */ | |this | |this | |~ | |~ | |~ | | | +-------------------------------------+ 在任何打開窗口的 Ex 命令前面,你都可以放上 ":tab"。這個窗口在新標簽頁中打開。 另一個例子: :tab help gt 它將在新的標簽頁中顯示關于 "gt" 的幫助。 使用標簽頁可以完成更多的工作: - 在末尾標簽后面的空白處單擊鼠標 選擇下個標簽頁,同 "gt"。 - 在右上角的 "X" 處單擊鼠標 關閉當前標簽頁,除非當前標簽頁中的改變沒有保存。 - 在標簽行上雙擊鼠標 建立新標簽頁。 - "tabonly" 命令 關閉除了當前標簽頁以外的所有標簽頁,除非其它標簽頁中的改變沒有保存。 |