*windows.txt* For Vim version 6.1. 原文最後更新: 2001年1月30日
VIM 參考手冊 作者:Bram Moolenaar
翻譯:Dasn<dasn@users.sf.net>
VCD主頁:http://vimcdoc.sf.net
使用多個窗口和緩衝區進行編輯 *windows* *buffers*
下面我們看一下操作多個窗口和緩衝區的命令。另外有些命令在操作多個窗口的時候不同
於單個窗口,這也是需要解釋的。
一些基本的內容在用戶手冊的第 7、8 兩個章節裡 |usr_07.txt| |usr_08.txt|
已經介紹過了。
1. 簡介 |windows-intro|
2. 啟動 Vim |windows-starting|
3. 打開和關閉一個窗口 |opening-window|
4. 把光標移動到另一個窗口 |window-move-cursor|
5. 窗口的移動 |window-moving|
6. 改變窗口的大小 |window-resize|
7. 參數和緩衝區的列表命令 |buffer-list|
8. 在所有的緩衝區和窗口裡執行命令 |list-repeat|
9. 當前光標處的標記和文件名 |window-tag|
10. 預覽窗口 |preview-window|
11. 使用隱藏的緩衝區 |buffer-hidden|
12. 特殊類型的緩衝區 |special-buffers|
{Vi 沒有這些命令}
{如果在編譯時沒有加入 |+windows|,則不能使用多個窗口}
{如果在編譯時沒有加入 |+vertsplit|,則不能垂直分割窗口}
1. 簡介 *windows-intro*
「窗口」被用來查看緩衝區裡的內容。你可以用多個窗口觀察同一個緩衝區,也可以用
多個窗口觀察不同的緩衝區。
「緩衝區」是一塊內存區域,裡面存儲著正在編輯的文件。如果沒有把緩衝區裡的文件存
盤,那麼原始文件不會被更改。
緩衝區的狀態可以是下述三種情況之一:
*active-buffer*
激活: 緩衝區的內容顯示在一個窗口裡。如果該緩衝區是針對某一個文件創建的,那
麼該文件已經被讀入緩衝區。如果緩衝區被更改過,其內容便會與原文件不同。
*hidden-buffer*
隱藏: 緩衝區的內容不被顯示。如果該緩衝區是針對某一個文件創建的,那麼麼該文
件已經被讀入緩衝區。其實它與激活狀態一樣,只是你看不見它。
*inactive-buffer*
非激活: 緩衝區的內容不被顯示,也不包含任何數據。文件一旦被裝入,與該緩衝區相
關的選項會被記住。這些選項可以包括 |viminfo| 文件裡的一些標記,但是
這種緩衝區不能包含文本。
用一個表來說明:
狀態 在窗口顯示 文件裝載 用 ":buffers" 命令
顯示
激活 yes yes 'a'
隱藏 no yes 'h'
非激活 no no ' '
Note: 所有的 CTRL-W 命令都可以用 |:wincmd| 執行,當我們不能在正常模式下輸入命
令,或者輸入不方便時可以試一下。
2. 啟動 Vim *windows-starting* 在默認情況下,與 Vi 類似, Vim 啟動後只打開一個窗口。 參數 "-o" 和 "-O" 可以讓 Vim 為參數列表裡的每一個文件打開一個窗口。參數 "-o" 水平分割窗口;參數 "-O" 垂直分割窗口。如果 "-o" 和 "-O" 都用了,那麼最後一個參 數決定分割的方向。例如,下面的例子打開三個水平分割的窗口:Vim -o file1 file2 file3參數 "-oN" ,這裡的 N 是一個十進制數,用這個參數可以打開 N 個水平分割的窗口。 如果文件名的個數多於窗口數目,則只打開 N 個窗口,這樣有一些文件就得不到窗口來 顯示。如果指定的窗口數多於文件的個數,那麼後面的幾個窗口會編輯空的緩衝區。同樣, "-ON" 打開 N 個垂直分割的窗口,相應的規則與 "-oN" 相同。 如果你打開了很多的文件,每個窗口都會便得很小。你可能需要設置 'winheight' 和 'winwidth' 選項來創建一個適合工作的環境。 Buf/Win Enter/Leave 等自動命令 |autocommand| 不會在打開窗口或讀取文件時運行, 只有在真正進入程序後才會運行。 *status-line* 狀態欄用來分割窗口。選項 'laststatus' 用來設置在什麼時候最後一個窗口可以有狀態 欄: 'laststatus' = 0 不要狀態欄 'laststatus' = 1 窗口數多於一個的時候 'laststatus' = 2 總是顯示狀態欄 你可以通過設置 'statusline' 選項來改變狀態欄的內容。 通常狀態欄用反色顯示。你可以通過修改 'highlight' 選項中的 's' 字符來改變。例如, "sb" 設置為粗體字。如果沒有啟用狀態欄加亮 ("sn"), 那麼字符 '^' 表示當前窗口, 字符 '=' 表示其它窗口。如果支持鼠標,並且已經通過設置 'mouse' 選項使之啟動,那 麼你可以用鼠標拖動狀態欄以改變窗口的大小。Note:如果你想讓狀態欄以反色顯示,但是它沒有。查看一下 'highlight' 選項是否包 含了 "si"。在 3.0 版本裡,這意味著反轉(invert)狀態欄,但是現在應該使用 "sr", 反轉(reverse)狀態欄,因為 "si" 現在表示斜體(italic)!如果你的終端不支持斜 體,那麼狀態欄還是會以反色顯示;這種問題只會出現在支持斜體字的 termcap 終端上。
3. 打開和關閉一個窗口 *opening-window* *E36*CTRL-Ws *CTRL-W_s*CTRL-WS *CTRL-W_S*CTRL-WCTRL-S*CTRL-W_CTRL-S* :[N]sp[lit] [++opt] [+cmd] *:sp* *:split* 把當前窗口分割成兩個,結果是兩個窗口顯示同一個文件。新打開的窗 口高度為 N (默認值是當前窗口高度的一半。減少當前窗口的高度, 空出地方給新的窗口(或者採用別的方案,如果你設置了 'equalalways' 選項,並且 'eadirection' 沒有設置為 "hor")。Note:CTRL-S不是在所有的終端都能使用,並且可能導致不能繼續輸 入,遇到這種情況,用CTRL-Q繼續。參見 |++opt| 和 |+cmd|。CTRL-WCTRL-V*CTRL-W_CTRL-V*CTRL-Wv *CTRL-W_v* :[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit* 與 |:split| 類似, 但垂直分割窗口。如果打開了 'equalalways' 選 項,並且選項 'eadirection' 沒有設置為 "ver" ,窗口會被水平鋪開, 除非你指定了窗口的寬度。Note:在其它地方CTRL-Q與CTRL-V,但是在這裡不是!CTRL-Wn *CTRL-W_n*CTRL-WCTRL_N *CTRL-W_CTRL-N* :[N]new [++opt] [+cmd] *:new* 創建一個新窗口並且開始編輯一個空文件。新窗口的高度為 N (默認 值為現存高度的一半)。減少當前窗口的高度,為新窗口留出空間(如 果你打開了 'equalalways' 選項,並且 'eadirection' 沒有設置為 "hor",那麼可能是另一種情況)。 也參見:|++opt| and |+cmd|。 如果設置了 'fileformats' 選項,那麼新緩衝區會使用這個值;如果 'fileformats' 為空,那麼使用當前緩衝區的 'fileformat' 值。這個 值可以被 |++opt| 參數覆蓋。 自動命令以如下順序執行: 1. 在當前窗口執行 WinLeave 2. 在新窗口裡執行 WinEnter 3. 在當前緩衝區執行 BufLeave 4. 在新緩衝區執行 BufEnter 這跟先執行 ":split" ,再執行一個 ":e" 命令的效果差不多。 :[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew* 與 |:new| 命令相似,但是它垂直分割窗口,如果打開了 'equalalways' 選項,並且選項 'eadirection' 沒有設置為 "ver" , 窗口會被水平鋪開,除非你指定了窗口的寬度。 :[N]new [++opt] [+cmd]{file}:[N]sp[lit] [++opt] [+cmd]{file}*:split_f* 創建一個新的窗口,並且開始編輯文件{file}。 如果使用了 [+cmd] 參數,文件加載完畢後會執行命令 |+cmd| 。 也參見:|++opt|。 新窗口的高度為 N (默認值為現存高度的一半)。減少當前窗口的高 度,為新窗口留出空間(如果你打開了 'equalalways' 選項,那麼可 能是另一種情況)。 :[N]sv[iew] [++opt] [+cmd]{file}*:sv* *:sview* *splitview* 與 ":split" 命令相同,但是會給緩衝區設置 'readonly' 。 :[N]sf[ind] [++opt] [+cmd]{file}*:sf* *:sfind* *splitfind* 與 ":split" 命令相同,但是會在 'path' 裡尋找{file}。如果找不 到,就不會分割窗口。CTRL-WCTRL-^*CTRL-W_CTRL-^* *CTRL-W_^*CTRL-W^ 執行 ":split #" 命令,把窗口分成兩個,並且編輯另一個文件。如果 指定了計數器,就變成了 ":split #N",分割窗口,並且編輯緩衝區 N 。Note'splitbelow' 和 'splitright' 會影響窗口。 *:vert* *:vertical* :vert[ical]{cmd}執行{cmd}。如果包含一個分割窗口的命令,那麼將垂直分割窗口。 :lefta[bove]{cmd}*:lefta* *leftabove* :abo[veleft]{cmd}*:abo* *:aboveleft* 執行{cmd}。如果包含一個分割窗口的命令,那麼將從當前窗口的左 (垂直分割)或者上方(水平分割)分割窗口,而不管 'splitbelow' 和 'splitright' 的設置。 :rightb[elow]{cmd}*:rightb* *:rightbelow* :bel[owright]{cmd}*:bel* *:belowright* 執行{cmd}。 如果包含一個分割窗口的命令,那麼將從當前窗口的右 (垂直分割)或者下方(水平分割)分割窗口,而不管 'splitbelow' 和 'splitright' 的設置。 *:topleft* *E442* :to[pleft]{cmd}執行{cmd}。如果包含一個分割窗口的命令,那麼該窗口出現在頂部, 並且佔據最大寬度。當垂直分割窗口時,窗口出現在最左邊,並且佔據 最大高度。 *:botright* :bo[tright]{cmd}執行{cmd}。如果包含一個分割窗口的命令,那麼該窗口出現在底部, 並且佔據最大寬度。當垂直分割窗口時,窗口出現在最右邊,並且佔據 最大高度。 這些調節符可以結合使用,打開一個垂直分割的並且佔據最大高度的窗口,例如::vertical topleft edit tags在最左邊打開一個垂直分割的、最大高度的窗口,用來編輯 tags 文件。 關閉一個窗口
CTRL-Wq *CTRL-W_q*CTRL-WCTRL-Q*CTRL-W_CTRL-Q* :q[uit] 退出當前窗口。如果退出的是最後一個窗口(不包括幫助窗口),就是 退出 Vim 。 如果設置了 'hidden' 並且只有此一個窗口監視當前緩衝區,那麼該緩 沖區被隱藏。 如果沒有設置 'hidden',並且只有當前這一個窗口監視該緩衝區,而 且緩衝區被修改了,那麼該命令不會成功。 (注意:CTRL-Q不是在所有的終端下都好用) :q[uit]! 退出當前窗口。如果這是緩衝區的最後一個窗口,那麼對於此緩衝區的 改動將全部丟失。如果退出的是最後一個窗口(不包括幫助窗口),就 是退出 Vim 。緩衝區裡的全部內容將丟失,即使設置了 'hidden' 。CTRL-Wc *CTRL-W_c* *:clo* *:close* :clo[se][!] 關閉當前窗口。如果設置了 'hidden' ,或者改動了緩衝區但是命令裡 用了[!],緩衝區會被隱藏。(除非還有一個窗口在編輯該緩衝區)。 該命令在下述情況下會失敗: *E444* - 只剩下最後一個窗口的時候。 - 當 'hidden' 沒有設置, 也沒有用 [!] ,並且緩衝區也已經被修改, 而且也沒有其他窗口監視該緩衝區的時候。對緩衝區的改動既不寫入 文件,也不會丟失,所以這是個「安全」的命令。CTRL-WCTRL-C*CTRL-W_CTRL-C* 你可能想用CTRL-WCTRL-C關閉當前窗口,但是這不行,因為CTRL-C是用來結束命令的。 *:hide* :hid[e] 退出當前窗口,除非這是屏幕上的最後一個窗口。緩衝區被隱藏起來( 除非還有另一個窗口正在編輯它,或者 'bufhidden' 設置為 "unload" 或 "delete")。 'hidden' 的值和這個命令沒有一點關係。 對緩衝區的改動既不寫入文件,也不會丟失,所以這是個「安全」的命 令。 :hid[e]{cmd}執行{cmd}並設置 'hidden' 選項。{cmd}執行完畢後,先前的 'hidden' 選項會被恢復。 例如::hide edit Makefile這條命令編輯 "Makefile" 文件,並且如果當前緩衝區有改動的話,隱 藏之。CTRL-Wo *CTRL-W_o* *E445*CTRL-WCTRL-O*CTRL-W_CTRL-O* *:on* *:only* :on[ly][!] 使當前窗口成為屏幕上唯一的窗口。其它窗口都關閉。 如果設置了 'hidden' 選項,被關閉窗口裡的所有緩衝區變成隱藏。 如果沒有設置 'hidden' ,但是設置了 'autowrite' 選項,那麼已經 更改的緩衝區被寫入文件。否則,那些包含被修改過的緩衝區的窗口不 能被關閉,除非使用 [!] 強制關閉。於是緩衝區轉入隱藏狀態,對緩 沖區的改動也不會丟失。
4. 把光標移動到另一個窗口 *window-move-cursor*CTRL-W<Down>*CTRL-W_<Down>*CTRL-WCTRL-J*CTRL-W_CTRL-J* *CTRL-W_j*CTRL-Wj 把光標向下移動 N 個窗口。 用光標的位置在兩個窗口之間做出選擇。CTRL-W<Up>*CTRL-W_<Up>*CTRL-WCTRL-K*CTRL-W_CTRL-K* *CTRL-W_k*CTRL-Wk 把光標向上移動 N 個窗口。 用光標的位置在兩個窗口之間做出選擇。CTRL-W<Left>*CTRL-W_<Left>*CTRL-WCTRL-H*CTRL-W_CTRL-H*CTRL-W<BS>*CTRL-W_<BS>* *CTRL-W_h*CTRL-Wh 把光標向左移動 N 個窗口。 用光標的位置在兩個窗口之間做出選擇。CTRL-W<Right>*CTRL-W_<Right>*CTRL-WCTRL-L*CTRL-W_CTRL-L* *CTRL-W_l*CTRL-Wl 把光標向左移動 N 個窗口。 用光標的位置在兩個窗口之間做出選擇。CTRL-Ww *CTRL-W_w* *CTRL-W_CTRL-W*CTRL-WCTRL-W如果沒有添加計數器,則將光標移動到當前窗口的 右/下方的窗口。如 果右下方沒有窗口,就移動到左上角的窗口。要是添加了計數器,就移 動到第 N 個窗口(從左上方到右下方依次計數)。 *CTRL-W_W*CTRL-WW 如果沒有添加計數器,則將光標移動到當前窗口的 左/上方的窗口。如 果左上方沒有窗口,就移動到右下角的窗口。要是添加了計數器,就移 動到第 N 個窗口(從左上方到右下方依次計數)。CTRL-Wt *CTRL-W_t* *CTRL-W_CTRL-T*CTRL-WCTRL-T把光標移動到左上角的窗口。CTRL-Wb *CTRL-W_b* *CTRL-W_CTRL-B*CTRL-WCTRL-B把光標移動到右下角的窗口。CTRL-Wp *CTRL-W_p* *CTRL-W_CTRL-P*CTRL-WCTRL-P移動到前一個(上次訪問的)窗口。 *CTRL-W_P* *E441*CTRL-WP 移動到前一個窗口。如果沒有前一個窗口就會出錯。 {如果編譯時沒有加入 |+quickfix| 則不可用} 在「可視」模式(Visual)下,如果窗口編輯的是同一個緩衝區,則光標所選擇的區域會 被保留;如果不是同一個緩衝區,則終止「可視」模式。 *:winc* *:wincmd* 這些命令也可以用 ":wincmd" 來執行: :[count]winc[md]{arg}與CTRL-W[count]{arg}相同。例如::wincmd j把光標移動到當前窗口下面的窗口。 這個命令在「正常」狀態不可用的時候(比如在 |CursorHold| 自動命 令執行的時候),或者在啟用「正常」狀態不方便時,特別好用。
5. 窗口的移動 *window-moving*CTRL-Wr *CTRL-W_r* *CTRL-W_CTRL-R* *E443*CTRL-WCTRL-R向右下方向移動窗口。第一個窗口變成第二個,第二個變成第三個…… 最後一個變成第一個。光標保留在相同窗口裡。 本操作只能移動同行或同列的窗口。 *CTRL-W_R*CTRL-WR 向左上方向移動窗口。第一個窗口變成第二個,第二個變成第三個…… 最後一個變成第一個。光標保留在相同窗口裡。 本操作只能移動同行或同列的窗口。CTRL-Wx *CTRL-W_x* *CTRL-W_CTRL-X*CTRL-WCTRL-X若沒有計數器:交換當前窗口與下一個窗口。如果沒有下一個窗口,則 與前一個窗口交換。 若有計數器:交換當前窗口與第 N 個窗口(第一個窗口為 1 )。光標 在另一個窗口裡。 如果既有垂直分割又有水平分割,那麼只能與當前窗口同行或者同列的 窗口進行交換。 下面的幾個命令可以被用來改變窗口的佈局。例如,CTRL-WK 可以把兩個垂直分割的窗 口變成水平分割的窗口。CTRL-WH 則正好相反。 *CTRL-W_K*CTRL-WK 把當前窗口放到最頂端,並且是最大寬度。這很像在關閉當前窗口之後, 再用 ":topleft split" 打開一個新的窗口,不過新窗口只包含當前窗 口的內容。 *CTRL-W_J*CTRL-WJ 把當前窗口放到最底部,並且是最大寬度。這很像在關閉當前窗口之後, 再用 ":botright split" 打開一個新的窗口,不過新窗口只包含當前 窗口的內容。 *CTRL-W_H*CTRL-WH 把當前窗口放到最左邊,並且是最大高度。這很像在關閉當前窗口之後, 再用 ":vert topleft split" 打開一個新的窗口,不過新窗口只包含 當前窗口的內容。{如果編譯時沒有加入 +vertsplit 屬性則不可用}*CTRL-W_L*CTRL-WL 把當前窗口放到最右邊,並且是最大高度。這很像在關閉當前窗口之後, 再用 ":vert botright split" 打開一個新的窗口,不過新窗口只包含 當前窗口的內容。{如果編譯時沒有加入 +vertsplit 屬性則不可用}
6. 改變窗口的大小 *window-resize*
*CTRL-W_=*
CTRL-W = 使得(幾乎)所有窗口等寬、等高,但是對當前窗口使用 'winheight'
和 'winwidth' 來設置。
:res[ize] -N *:res* *:resize* *CTRL-W_-*
CTRL-W - 使得當前窗口高度減 N (默認值是 1)。
如果在 'vertical' 之後使用,則使得寬度減 N 。
:res[ize] +N *CTRL-W_+*
CTRL-W + 使得當前窗口高度加 N (默認值是 1)。
如果在 'vertical' 之後使用,則使得寬度加 N 。
:res[ize] [N]
CTRL-W CTRL-_ *CTRL-W_CTRL-_* *CTRL-W__*
CTRL-W _ 設置當前窗口的高度為 N (默認值為可能的最大值)。
z{nr}<CR> 設置當前窗口的高度為 {nr} 。
*CTRL-W_<*
CTRL-W < 使得當前窗口寬度減 N (默認值是 1)。
*CTRL-W_>*
CTRL-W > 使得當前窗口寬度加 N (默認值是 1)。
:vertical res[ize] [N] *:vertical-resize* *CTRL-W_bar*
CTRL-W | 設置當前窗口的寬度為 N (默認值為可能的最大值)。
你也可以用鼠標上下拖動水平分割欄來改變窗口的高度,或者左右拖動垂直分割欄來改變
窗口寬度。這些功能只有在支持鼠標的版本裡,並且設置了 'mouse' 選項才可以用。
選項 'winheight' ('wh') 用來設置當前窗口的最小高度。每當其它窗口變為當前窗口的
時候,這一選項就會生效。如果設置為 0 ,則禁用。把 'winheight' 設一個很大的值,
例如,'9999',就使得當前窗口永遠佔據盡可能大的空間。設置一個合理的值,比如說,
'10',就會感覺比較舒服。
同樣,'winwidth' ('wiw') 選項設定了當前窗口的最小寬度。
如果設置了 'equalalways' ('ea') 選項,在分割或者關閉窗口之後,所有窗口都會變為
相同大小。如果你沒有設置這個選項,分割窗口時只會減少當前窗口的大小,而其它窗口
保持不變。當關閉窗口時,多出來的行會被上面的窗口佔用。
選項 'eadirection' 用來限制 'equalalways' 的作用方向。默認值是 "both" ,兩個方
向都改變。當設置為 "ver" 時,只限制所有窗口的高度必須相同,這樣你可以自己調節
窗口的寬度。同樣,"hor" 使得窗口的寬度都相等。
選項 'cmdheight' ('ch') 用來設置命令行的高度。如果你對 |hit-enter| 的提示信息
感到厭煩,就把它設置為 2 或 3 。
如果只有一個窗口,那麼改變該窗口大小的同時也會改變命令行的高度。如果有多個窗口,
那麼改變當前窗口的大小也會改變它下面的窗口(有時是上面的窗口)的高度。
一個窗口的最小高度和最小寬度可以用 'winminheight' 和 'winminwidth' 設定。這是
硬性值,一旦設定,窗口的高度(或寬度)將不能小於該值。
7. 參數和緩衝區的列表命令 *buffer-list*參數列表 緩衝區列表 含義1. :[N]argument [N] 11. :[N]buffer [N] 切換至第 N 號參數/緩衝區 2. :[N]next [file ..] 12. :[N]bnext [N] 切換至向後數第 N 個參數/緩衝區 3. :[N]Next [N] 13. :[N]bNext [N] 切換至向前數第 N 個參數/緩衝區 4. :[N]previous [N] 14. :[N]bprevious [N] 切換至向前數第 N 個參數/緩衝區 5. :rewind / :first 15. :brewind / :bfirst 切換至第一個參數/緩衝區 6. :last 16. :blast 切換至最後一個參數/緩衝區 7. :all 17. :ball 編輯所有的參數/緩衝區 18. :unhide 編輯所有已載入的緩衝區 19. :[N]bmod [N] 切換至第 N 個已修改的緩衝區分割 & 參數列表 分割 & 緩衝區列表 含義21. :[N]sargument [N] 31. :[N]sbuffer [N] 分割 + 切換至第 N 號參數/緩衝區 22. :[N]snext [file ..] 32. :[N]sbnext [N] 分割 + 切換至向後數第 N 個參數/緩衝區 23. :[N]sNext [N] 33. :[N]sbNext [N] 分割 + 切換至向前數第 N 個參數/緩衝區 24. :[N]sprevious [N] 34. :[N]sbprevious [N] 分割 + 切換至向前數第 N 個參數/緩衝區 25. :srewind / :sfirst 35. :sbrewind / :sbfirst 分割 + 切換至第一個參數/緩衝區 26. :slast 36. :sblast 分割 + 切換至最後一個參數/緩衝區 27. :sall 37: :sball 編輯所有的參數/緩衝區 38. :sunhide 編輯所有已載入的緩衝區 39. :[N]sbmod [N] 分割 + 切換至第 N 個已修改的緩衝區 40. :args 顯示參數列表 41. :buffers 顯示緩衝區列表 上述命令中的 [N] 是什麼含義,取決於你使用什麼命令: 在命令 ?2,?3,和 ?4 中,[N] 是向前/向後的個數。 在命令 1 和 21 中,[N] 是參數號碼,默認值是當前參數。 在命令 11 和 31 中,[N] 是緩衝區號碼,默認值是當前緩衝區。 在命令 19 和 39 中,[N] 計數器。Note:":next" 是一個例外,因為它必須以文件名列表為參數,這是為了和 Vi 兼容。 參數列表和多窗口
每一個窗口所編輯的文件可能位於參數列表的不同位置。記住!當 ":e file" 一個文件
時,你在參數列表中的位置沒有變化,但你並不是在編輯處於那個位置的文件。為了說明
這一點,文件消息(和標題欄,如果有的話)會顯示 "(file (N) of M)","(N)" 是當前
文件在列表中的位置,"M" 是列表中文件的數量。
所有參數列表中的條目都被加載到緩衝區列表中,這樣你也可以用緩衝區列表的命令進行
操作,比如":bnext" 。
:[N]al[l][!] [N] *:al* *:all* *:sal* *:sall*
:[N]sal[l][!] [N]
重新整理屏幕,為每一個參數打開一個窗口。其它窗口統統關閉。如果
使用了計數器,則其數值為窗口數目的最大值。
如果設置了 'hidden' ,所有要關閉的窗口變為隱藏。
如果沒有設置 'hidden' ,但是設置了 'autowrite' ,那麼所有改動
的緩衝區被寫入文件。否則,包含更改過的緩衝區的窗口不會被刪除,
除非你用 [!] 使它們隱藏。更改過的緩衝區永遠不會被丟棄,所以改
動不會丟失。
Buf/Win Enter/Leave 自動命令不會被這裡的新窗口執
行,只有在它們真正進入時才會執行。
:[N]sa[rgument][!] [++opt] [+cmd] [N] *:sa* *:sargument*
這是 ":split | argument [N]" 命令的簡寫。分割窗口並切換至第 N
號參數。但是如果該參數不存在,窗口也不會分割。參見 |++opt| 和
|+cmd| 。
:[N]sn[ext][!] [++opt] [+cmd] [file ..] *:sn* *:snext*
這是 ":split | [N]next" 命令的簡寫。 分割窗口並切換到向後數第
N 個參數。 但是如果該參數不存在,窗口也不會分割。參見 |++opt|
和 |+cmd| 。
:[N]spr[evious][!] [++opt] [+cmd] [N] *:spr* *:sprevious*
:[N]sN[ext][!] [++opt] [+cmd] [N] *:sN* *:sNext*
這是 ":split | [N]Next" 命令的簡寫。 分割窗口並切換到向前數第
N 個參數。 但是如果該參數不存在,窗口也不會分割。參見 |++opt|
和 |+cmd| 。
*:sr* *:srewind*
:sr[ewind][!] [++opt] [+cmd]
這是 ":split | rewind" 命令的簡寫。分割窗口並切換到第一個參數。
但是如果沒有參數列表,窗口不會分割。參見 |++opt| 和 |+cmd| 。
*:sfir* *:sfirst*
:sfir[st [++opt] [+cmd]
與 ":srewind" 相同。
*:sla* *:slast*
:sla[st][!] [++opt] [+cmd]
這是 ":split | rewind" 命令的簡寫。分割窗口並切換到最後一個參
數。 但是如果沒有參數列表,窗口不會分割。參見 |++opt| 和
|+cmd| 。
*:dr* *:drop*
:dr[op] {file} ..
把參數列表重新定義為 "{file} .." ,與 ":next" 類似。如果可能的
話,第一個文件出現在當前窗口裡。
如果當前緩衝區沒有被丟棄 |abandon| ,窗口首先被分割。此命令的
目的在於:可以在 debugger 之類的程序裡讓 Vim 編輯另一個文件。
{只有在編譯時加入 +gui 才可用}
8. 在所有的緩衝區和窗口裡執行命令 *list-repeat*
*:windo*
:windo[!] {cmd} 在每一個窗口裡執行 {cmd} 。
這就像是:
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
等等……
當在一個窗口裡檢測到錯誤,剩下的窗口沒有被訪問到。最後
一個窗口(或者出錯的那個窗口)變為當前窗口。
{cmd} 可以包含 '|' 來連接多個命令。
{cmd} 不能打開或關閉窗口,也不能重新裝載它們。
Note: 當這個命令正在執行的時候,自動命令的語法事件可以
通過 'eventignore' 禁止。
{Vi 不可用} {若編譯時沒有加入 |+listcmds| 則不可用}
也參見 |:argdo| 和 |:bufdo|.
*:bufdo*
:bufdo[!] {cmd} 在每一個緩衝區裡執行 {cmd} 。
就像是:
:bfirst
:{cmd}
:bnext
:{cmd}
等等……
如果當前文件不能被丟棄 |abandon| ,並且沒有使用[!],則
會出錯當在一個緩衝區裡檢測到錯誤,剩下的緩衝區沒有被訪問到。
沒有在列表裡出現的緩衝區被略過。
最後一個緩衝區(或者出錯的那個緩衝區)變為當前緩衝區。
{cmd} 可以包含 '|' 來連接多個命令。
{cmd} 不能在列表裡刪除或添加緩衝區。
Note: 當這個命令正在執行的時候,自動命令的語法事件可以
通過 'eventignore' 禁止。這樣會加快編輯緩衝區的速度。
{Vi 不可用} {若編譯時沒有加入 |+listcmds| 則不可用}
參見 |:argdo| 和 |:windo| 。
例子:
:windo set nolist nofoldcolumn | normal zn
這個命令重新設置了 'list' 選項並在所有的窗口裡關閉了折疊功能。
:bufdo set fileencoding= | update
此命令在每個緩衝區裡重新設置了 'fileencoding' ,並將改動的緩衝區存盤。結果是所
有的緩衝區用 'encoding' 編碼(如果執行順利的話)。
9. 當前光標處的標記和文件名 *window-tag*
*:sta* *:stag*
:sta[g][!] [tagname]
執行 ":tag[!] [tagname]" 並且分割窗口打開新的標記。參見 |:tag|
。
CTRL-W ] *CTRL-W_]* *CTRL-W_CTRL-]*
CTRL-W CTRL-] 把當前窗口一分為二,把光標所位置的標識符當作標記,並跳轉至標記
所指向的地方。新窗口(上面的窗口)的高度為 N 。
*CTRL-W_g]*
CTRL-W g ] 把當前窗口一分為二,把光標所位置的標識符當作標記,並在新窗口(
上面的窗口)裡執行 ":tselect" 。新窗口的高度為 N 。
*CTRL-W_g_CTRL-]*
CTRL-W g CTRL-] 把當前窗口一分為二,把光標所位置的標識符當作標記,並在新窗口(
上面的窗口)裡執行 ":tjump" 。新窗口的高度為 N 。
CTRL-W f *CTRL-W_f* *CTRL-W_CTRL-F*
CTRL-W CTRL-F 把當前窗口一分為二。編輯光標下的文件名。
類似 ":split ]f",但是找不到文件或者文件不存在時,不會分割窗口。
此操作在 'path' 變量所定義的目錄和當前文件所在的目錄裡尋找文件。
如果是一個類似 "type://machine/path" 的超鏈接,那麼只使用
"/path" 。
如果指定了計數器 N ,那麼編輯第 N 個匹配的文件。
{如果 |+file_in_path| 在編譯時被禁用,則不可用}
參見 |CTRL-W_CTRL-I| :為包含文件打開一個窗口(該文件包含當前光標下的關鍵字)。
10. 預覽窗口 *preview-window*
預覽窗口是預覽其它文件的特殊窗口。它通常是一個用來查看包含文件或者函數定義的小
窗口。 {若編譯時未加入 |+quickfix| 屬性,則不可用}
只能有一個預覽窗口,可以用如下命令之一創建。選項 'previewheight' 可以用來制定
預覽窗口的高度;選項 'previewwindow' 使得預覽窗口可區分。
*:pta* *:ptag*
:pta[g][!] [tagname]
執行 ":tag[!] [tagname]" 並且在預覽窗口裡顯示標籤所指向的內容,
而不改變當前緩衝區和光標的位置。如果預覽窗口已經打開,則會被再
次使用(類似於幫助窗口)。如果是打開一個新的預覽窗口,那麼其高
度由 'previewheight' 決定。也參見 |:tag| 。參考下面這個例子。
|CursorHold-example|
CTRL-W z *CTRL-W_z*
CTRL-W CTRL-Z *CTRL-W_CTRL-Z* *:pc* *:pclose*
:pc[lose][!] 關閉當前打開的預覽窗口。如果設置了 'hidden' ,或者更改了緩衝區
並且使用了 [!] ,則緩衝區變為隱藏(除非還有其它窗口正在編輯該
緩衝區)。如果預覽窗口的緩衝區不能關閉,此命令失敗。也參見
|:close|.
*:pp* *:ppop*
:[count]pp[op][!]
在預覽窗口執行 ":[count]pop[!]" 。參見 |:pop| 和 |:ptag| 。
{Vi 沒有此功能}
CTRL-W } *CTRL-W_}*
使用當前光標所處位置的標識符作為標籤,執行 :ptag 。生成預覽窗
口(如果需要的話),窗口的高度為 N ,如果沒指定高度,就使用
'previewheight' 的值。
CTRL-W g } *CTRL-W_g}*
使用當前光標所處位置的標識符作為標籤,執行 :ptjump 。生成預覽
窗口(如果需要的話),窗口的高度為 N ,如果沒指定高度,就使用
'previewheight' 的值。
*:ped* *:pedit*
:ped[it][!] [++opt] [+cmd] {file}
在預覽窗口裡編輯文件 {file} 。預覽窗口就像是用 |:ptag| 命令打
開的。當前窗口和光標的位置都不改變。一個有用的例子:
:pedit +/fputc /usr/include/stdio.h
*:ps* *:psearch*
:[range]ps[earch][!] [count] [/]pattern[/]
與 |:ijump| 命令很像,只是找到匹配的在預覽窗口顯示。預覽窗口用
|:ptag| 打開。 當前窗口和光標的位置都不改變。有用的例子:
:psearch popen
這很像 |:ptag| 命令,你可以用它自動顯示光標所在單詞的相關信息。
這個命令雖然不如 |:ptag| 用起來爽,但是你可以不使用標記文件,
並且它也可以找到一些系統的頭文件。例如:
:au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>")
警告:可能會很慢。
例子 *CursorHold-example*
:au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>")
這條命令以當前光標位置處的關鍵字為參數,執行 ":ptag" 命令。'updatetime' 指定了
光標停留的時間;"nested" 使得自動命令得以執行,這樣可以在預覽窗口裡啟用語法加
亮。"silent!" 屏蔽了在找不到標籤時產生的錯誤信息。也參見 |CursorHold| 。要禁用
此功能:
:au! CursorHold
另一個比較好用的功能是加亮已經找到的標籤,這樣可以避免對光標處沒有定義的單詞執
行 ":ptag",和一些別的東西:
:au! CursorHold *.[ch] nested call PreviewWord()
:func PreviewWord()
: if &previewwindow " 不要在預覽窗口裡執行
: return
: endif
: let w = expand("<cword>") " 在當前光標位置抓詞
: if w != "" " 如果該詞可以通過 ":ptag" 找到其定義
:
: " 在顯示下一個標籤之前,刪除所有現存的語法加亮
: silent! wincmd P " 跳轉至預覽窗口
: if &previewwindow " 如果確實轉到了預覽窗口……
: match none " 刪除語法加亮
: wincmd p " 回到原來的窗口
: endif
:
: " 顯示當前光標處匹配的標籤
: let v:errmsg = ""
: exe "silent! ptag " . w
: if v:errmsg =~ "tag not found"
: return
: endif
:
: silent! wincmd P " 跳轉至預覽窗口
: if &previewwindow " 如果確實轉到了預覽窗口……
: if has("folding")
: silent! .foldopen " 展開折疊的行
: endif
: call search("$", "b") " 到前一行的行尾
: let w = substitute(w, '\\', '\\\\', "")
: call search('\<\V' . w . '\>') " 把光標放置匹配的單詞上
: " 在此位置對匹配的單詞加亮
: hi previewWord term=bold ctermbg=green guibg=green
: exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
: wincmd p " 返回原來的窗口
: endif
: endif
:endfun
11. 使用隱藏的緩衝區 *buffer-hidden*
隱藏的緩衝區已經載入內存,但是不會顯示在窗口裡。這使得 Vim 每次從一個文件切換
到另一個文件時,不必頻繁地讀寫磁盤。 {若編譯時沒加入 |+listcmds| ,則不可用}
*:buffer-!*
如果設置了 'hidden' ('hid') ,那麼被丟棄的緩衝區會記憶你在 ":edit", ":next",
":tag",等命令之後進行的所有操作。雖然有時沒有設置 'hidden',但是有一些作用於
緩衝區列表的命令還是會把當前窗口變為隱藏。這種情況發生在:當 'autowrite' 選項
是關閉的或者緩衝區不可保存時,你試圖用 '!' 強制刪除一個修改過的緩衝區窗口。
你可以用任何編輯命令使隱藏的緩衝區不再隱藏。或者用 ":bdelete" 命令將其刪除。
'hidden' 是全局選項, 它作用於所有的緩衝區。'bufhidden' 選項可以作用於指定的緩
沖區,該選項可以是下面的值:
<empty> 使用 'hidden' 的值。
hide 隱藏該緩衝區,也適合於 'hidden' 沒有設置的情況。
unload 不隱藏,而是卸載該緩衝區,也適合於設置了 'hidden' 的情
況。
delete 刪除該緩衝區。
*hidden-quit*
如果存在一個隱含的,並且被修改過的緩衝區,若此時退出 Vim 會得到一條錯誤信息,
並且 Vim 會把該緩衝區變為當前的緩衝區。你可以決定是保存(":wq")還是退出(
":q!")。注意:可能不止一個隱藏的並且已被修改的緩衝區!
緩衝區也可能是非列表的(unlisted),這意味著此緩衝區存在,但是從緩衝區列表中看
不到。|unlisted-buffer|
:files[!] *:files*
:buffers[!] *:buffers* *:ls*
:ls[!] 顯示所有緩衝區。例如:
1 #h "/test/text" line 1
2u "asdf" line 0
3 %l+ "version.c" line 1
如果使用了 [!] ,將顯示所有的緩衝區,包括非列表的緩衝區。(
"unlisted" —— 「非列表」這一術語有點兒彆扭……)。
每一個緩衝區都有唯一的號碼與之對應。這個號碼是不會改變的,所以
你可以一直使用 ":buffer N" 或 "N CTRL-^" (N 是緩衝區號碼)來
選擇特定的緩衝區。
標識符號(同一列上的符號不可能同時出現):
u 非列表緩衝區(只有使用 [!] 才能看到)|unlisted-buffer|
% 當前窗口裡的緩衝區
# 用 ":e #" 或 CTRL-^ 可切換到該緩衝區
a 激活的緩衝區:已載入內存並且可見
h 隱藏的緩衝區:已載入內存但是沒有窗口顯示它
|hidden-buffer|
- 不可更改的緩衝區,選項 'modifiable' 被關閉。
= 只讀緩衝區
+ 被更改的緩衝區
*:bad* *:badd*
:bad[d] [+lnum] {fname}
在緩衝區列表裡添加一個文件名 {fname} ,但是不把該文件載入內存。
如果指定了 "lnum" ,那麼第一次進入緩衝區時,光標會停留在那一行。
Note + 後面的其它命令將被忽略。
:[N]bd[elete][!] *:bd* *:bdel* *:bdelete*
:bd[elete][!] [N]
卸載緩衝區 [N] (默認:當前窗口)並且從緩衝區列表裡刪除該緩衝
區。如果緩衝區被改動過,那麼該命令將失敗,除非使用[!] ,但是這
樣所有的改動都會丟失。文件和 Vim 失去聯繫。打開該文件的所有窗
口都會關閉。如果緩衝區 [N] 是當前的緩衝區,那麼 Vim 會顯示另一
個緩衝區來替代它。Vim 會選擇列表中距離最近的一個裝入緩衝區。
實際上,該緩衝區沒有被完全從緩衝區列表 |unlisted-buffer|
裡刪除。該緩衝區中選項的值、變量、映射和縮略詞被清空。
:bdelete[!] {bufname} *E93* *E94*
類似 ":bdelete[!] [N]",但是使用名字指定緩衝區。
Note 如果緩衝區名字是數字的,不能用該命令引用;用號碼代替。如
果名字裡含有空格,在空格前插入反斜槓。
:bdelete[!] N1 N2 ...
對緩衝區 N1,N2,……執行 ":bdelete[!]" 。
參數可以是名字或號碼(但是名字裡不能含有數字)。
如果名字裡含有空格,在空格前插入反斜槓。
:N,Mbdelete[!] 對 N 號到 M 號(包含 N 和 M )緩衝區執行 ":bdelete[!]"
:[N]bw[ipeout][!] *:bw* *:bwipe* *:bwipeout*
:bw[ipeout][!] {bufname}
:N,Mbw[ipeout][!]
:bw[ipeout][!] N1 N2 ...
類似 ":bdelete",真正刪除緩衝區。所有標記失效,選項丟失,等等。
不要用,除非你知道自己正在做什麼。
:[N]bun[load][!] *:bun* *:bunload*
:bun[load][!] [N]
卸載緩衝區 [N] (默認:當前緩衝區)。原來佔用的內存將被釋放該
緩衝區還保留在緩衝區列表裡如果緩衝區被改動過,那麼該命令將失敗,
除非使用[!] ,但是這樣所有的改動都會丟失。如果緩衝區 [N] 是當
前的緩衝區,那麼 Vim 會顯示另一個緩衝區來替代它。Vim 會選擇列
表中距離最近的一個裝入緩衝區。
:bunload[!] {bufname}
類似 ":bunload[!] [N]", 但是使用名字指定緩衝區。
Note 如果緩衝區名字是數字的,不能用該命令引用;用號碼代替。如
果名字裡含有空格,在空格前插入反斜槓。
:N,Mbunload[!] 對 N 號到 M 號(包含 N 和 M )緩衝區執行 ":bunload[!]"
:bunload[!] N1 N2 ...
對緩衝區 N1,N2,……執行 ":bunload[!]" 。
參數可以是名字或號碼(但是名字裡不能含有數字)。
如果名字裡含有空格,在空格前插入反斜槓。
:[N]b[uffer][!] [N] *:b* *:bu* *:buf* *:buffer* *E86*
編輯列表中的緩衝區 [N] ,如果沒指定 [N] ,就編輯當前的緩衝區。
對於 [!] 參見 |:buffer-!| 。這個命令同樣可以編輯不再列表裡的緩
沖區,而無需設置 'buflisted' 。
:[N]b[uffer][!] {filename}
編輯列表中的緩衝區 {filename}。對於 [!] 參見 |:buffer-!| 。這
個命令同樣可以編輯不再列表裡的緩衝區,而無需設置 'buflisted'
。
:[N]sb[uffer] [N] *:sb* *:sbuffer*
分割窗口編輯列表中的緩衝區 [N] ,如果沒指定 [N] ,就編輯當前的
緩衝區。分割窗口的時候要看 'switchbuf' 是不是設置了 "useopen"
。這個命令同樣可以編輯不再列表裡的緩衝區,而無需設置
'buflisted' 。
:[N]sb[uffer] {filename}
分割窗口編輯列表中的緩衝區 {filename}。這個命令同樣可以編輯不
再列表裡的緩衝區,而無需設置 'buflisted' 。
*:bn* *:bnext* *E87*
:[N]bn[ext][!] [N]
前進至後面的第 [N] 個緩衝區。 [N] 默認是 1 。如果到了緩衝區列
表的末尾,則從頭循環。對於 [!] 參見 |:buffer-!|
如果你在幫助文件緩衝區裡,這條命令讓你跳到下一個幫助緩衝區(如
果有的話)。同樣,你在一個正常(非幫助)緩衝區裡,就會使你跳到
下一個正常緩衝區。這樣是為了在打開幫助的時候不會影響到瀏覽正常
的代碼或文本。下面的命令都是這樣。
*:sbn* *:sbnext*
:[N]sbn[ext] [N]
分割窗口前進至後面的第 [N] 個緩衝區。
如果到了緩衝區列表的末尾,則從頭循環。使用 'switchbuf'
:[N]bN[ext][!] [N] *:bN* *:bNext* *:bp* *:bprevious* *E88*
:[N]bp[revious][!] [N]
到前面的第 [N] 個緩衝區。 [N] 默認是 1 。
如果到了緩衝區列表的頂端,則從末尾循環。對於 [!] 參見
|:buffer-!| 和 'switchbuf' 。
:[N]sbN[ext] [N] *:sbN* *:sbNext* *:sbp* *:sbprevious*
:[N]sbp[revious] [N]
分割窗口並前進到前面的第 [N] 個緩衝區。 [N] 默認是 1 。
如果到了緩衝區列表的頂端,則從末尾循環。對於 [!] 參見
|:buffer-!| 和 'switchbuf' 。
*:br* *:brewind*
:br[ewind][!]
前進到緩衝區列表中的第一個緩衝區。
如果列表為空,則轉到第一個非列表緩衝區。對於 [!] 參見
|:buffer-!|
*:bf* *:bfirst*
:bf[irst 與 ":brewind" 相同。
*:sbr* *:sbrewind*
:sbr[ewind] 分割窗口並前進到緩衝區列表中的第一個緩衝區。
如果列表為空,則轉到第一個非列表緩衝區。對於 [!] 參見
|:buffer-!|
還需考慮 'switchbuf' 選項。
*:sbf* *:sbfirst*
:sbf[irst] 與 ":sbrewind" 相同。
*:bl* *:blast*
:bl[ast][!] 前進到緩衝區列表中的最後一個緩衝區。
如果列表為空,則轉到最後一個非列表緩衝區。對於 [!] 參見
|:buffer-!|
還需考慮 'switchbuf' 選項。
*:sbl* *:sblast*
:sbl[ast] 分割窗口並前進到緩衝區列表中的最後一個緩衝區。
如果列表為空,則轉到最後一個非列表緩衝區。對於 [!] 參見
|:buffer-!|
還需考慮 'switchbuf' 選項。
:[N]bm[odified][!] [N] *:bm* *:bmodified* *E84*
前進至第 [N] 個修改過的緩衝區。 Note: 這一命令同樣也能找到非
列表緩衝區。如果沒有修改的緩衝區,此命令失敗。
:[N]sbm[odified] [N] *:sbm* *:sbmodified*
分割窗口並前進至第 [N] 個修改過的緩衝區。
還需考慮 'switchbuf' 選項。
Note: 這個命令也能找到不再列表裡的緩衝區。
:[N]unh[ide] [N] *:unh* *:unhide* *:sun* *:sunhide*
:[N]sun[hide] [N]
重新排列窗口,給列表中的每一個載入的緩衝區打開一個窗口。如果設
置了計數器,則計數器指定的數目為打開窗口的最多數目。
:[N]ba[ll] [N] *:ba* *:ball* *:sba* *:sball*
:[N]sba[ll] [N] 重新排列窗口,給列表中的每一個緩衝區打開一個窗口。如果設置了計
數器,則計數器指定的數目為打開窗口的最多數目。
Buf/Win Enter/Leave 不會在新窗口執行,只會在真正進入窗口時才會執行。
Note: 上面所有的命令在編輯另一個緩衝區的時候,總是保持 'readonly' 不變。這和
":edit" 命令不同,它每次都會設置 'readonly' 。
12. 特殊類型的緩衝區 *special-buffers*
除了用來存放文本,緩衝區也可以用於其它目的。一些選項可以改變緩衝區的行為:
'bufhidden' 緩衝區不再在窗口裡顯示
'buftype' 緩衝區的類型
'swapfile' 緩衝區是否需要交換文件
'buflisted' 緩衝區是否在緩衝區列表中出現
有用的緩衝區類型:
quickfix 用來存放錯誤列表。參見 |:cwindow|。該命令設置 'buftype' 的值為
"quickfix" 。你不應該修改它。關閉 'swapfile' 。
help 包含幫助文件。只能用 |:help| 命令創建,緩衝區的幫助標誌是內置
的,不能被更改。選項 'buflisted' 在幫助緩衝區裡將被重置。
directory 顯示目錄內容。應用於 |file-explorer| 插件。該緩衝區由一下設置
創建:
:set buftype=nowrite
:set bufhidden=delete
:set noswapfile
緩衝區的名字就是目錄的名字,並且在使用 |:cd| 命令時會作出相應
的調整。
scratch 該緩衝區包含的文本可以被隨時扔掉。在關閉窗口時,它被保存下來,
並且必須被明確地刪除。
設置:
:set buftype=nofile
:set bufhidden=hide
:set noswapfile
緩衝區的名字可以用來標識緩衝區。
*unlisted-buffer*
unlisted 該緩衝區不在緩衝區列表裡。它不能用來編輯,但是可以顯示幫助文件,
記錄文件名或標記。":bdelete" 命令也會設置這個選項,這樣就不會
完全地刪除該緩衝區。設置:
:set nobuflisted
vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl:
Generated by vim2html on Thu Dec 9 14:14:27 CST 2004