視窗

Nvim 的 :help 頁面,使用 tree-sitter-vimdoc 解析器,從 來源 產生


使用多個視窗和緩衝區進行編輯。 緩衝區
這裡解釋了新增用來使用多個視窗和緩衝區的命令。此外,還有說明當與多個視窗組合使用時,行為不同的命令。
基本概念在使用者手冊的第 7 和第 8 章 usr_07.txt usr_08.txt 中說明。
摘要:緩衝區是檔案在記憶體中的文字。視窗是緩衝區的視圖。標籤頁是視窗的集合。
視窗是緩衝區的視圖。您可以在一個緩衝區上使用多個視窗,或在不同的緩衝區上使用多個視窗。
緩衝區是載入到記憶體中進行編輯的檔案。在您將緩衝區寫入檔案之前,原始檔案保持不變。
緩衝區可以處於以下三種狀態之一
active-buffer
活動 (active):緩衝區顯示在視窗中。如果此緩衝區有檔案,則該檔案已讀入緩衝區。從那時起,緩衝區可能已被修改,因此與檔案不同。 hidden-buffer
隱藏 (hidden):緩衝區未顯示。如果此緩衝區有檔案,則該檔案已讀入緩衝區。否則,它與活動緩衝區相同,您只是看不到它。 inactive-buffer
非活動 (inactive):緩衝區未顯示,且不包含任何內容。如果檔案曾經載入,則會記住緩衝區的選項。它可以包含來自 shada 檔案的標記。但緩衝區不包含文字。
以表格呈現
狀態 顯示 已載入 ":buffers"
在視窗中 顯示
活動 是 是 'a' 隱藏 否 是 'h' 非活動 否 否 ' '
buffer-reuse
每個緩衝區都有一個唯一的編號,且該編號在 Vim 會話中不會更改。可以使用 bufnr()bufname() 函數在緩衝區名稱和緩衝區編號之間進行轉換。有一個例外:如果建立新的空緩衝區且未修改,則將另一個檔案載入該緩衝區時,將會重複使用該緩衝區。這也表示緩衝區編號不會更改。
主要的 Vim 視窗可以容納多個分割視窗。還有標籤頁 tab-page,每個標籤頁可以容納多個視窗。
focusable
如果視窗是可聚焦的,則它是「導覽堆疊」的一部分,也就是說,諸如 :windo、CTRL-W 等編輯器命令,會將該視窗視為可以成為「目前視窗」的視窗。非可聚焦的視窗將會被此類命令跳過(但可以透過 nvim_set_current_win() 明確聚焦)。
視窗(尤其是浮動視窗)可以具有許多其他 api-win_config 屬性,例如「hide」和「fixed」,這些屬性也會影響行為。
window-ID winid windowid 每個視窗都有一個稱為視窗 ID 的唯一識別碼。此識別碼在 Vim 會話中不會更改。可以使用 win_getid()win_id2tabwin() 函數在視窗/標籤頁編號和識別碼之間進行轉換。還有視窗編號,視窗開啟或關閉時可能會更改,請參閱 winnr()。視窗編號僅在一個特定的標籤頁中有效。視窗 ID 在所有標籤頁中都有效。對於大多數採用視窗 ID 或視窗編號的函數,視窗編號僅適用於目前的標籤頁,而視窗 ID 可以指任何標籤頁中的視窗。

2. 啟動 Vim windows-starting

預設情況下,Vim 會像 Vi 一樣以一個視窗啟動。
Vim 的 "-o" 和 "-O" 引數可用來為引數列表中的每個檔案開啟一個視窗。"-o" 引數會水平分割視窗;"-O" 引數會垂直分割視窗。如果同時給定 "-o" 和 "-O",則會使用最後遇到的引數來判斷分割方向。例如,這將開啟三個水平分割的視窗
vim -o file1 file2 file3
"-oN",其中 N 是十進位數字,會開啟 N 個水平分割的視窗。如果檔案名稱多於視窗,則僅開啟 N 個視窗,並且某些檔案不會取得視窗。如果視窗多於檔案名稱,則最後幾個視窗將編輯空的緩衝區。同樣,"-ON" 會開啟 N 個垂直分割的視窗,且具有相同的限制。
如果有很多檔案名稱,視窗會變得非常小。您可能需要設定 'winheight' 和/或 'winwidth' 選項以建立可操作的情況。
開啟新視窗並讀取檔案時,不會執行緩衝區/視窗進入/離開 自動指令,只有在它們真正進入時才會執行。
status-line
狀態列將用來分隔視窗。'laststatus' 選項指示最後一個視窗何時也有狀態列: 'laststatus' = 0 永遠不顯示狀態列 'laststatus' = 1 如果有多個視窗則顯示狀態列 'laststatus' = 2 總是顯示狀態列 'laststatus' = 3 在底部顯示全域狀態列,而不是每個視窗一個
您可以使用 'statusline' 選項來變更狀態列的內容。此選項可以是視窗的本機選項,因此您可以在每個視窗中具有不同的狀態列。
通常,反相會用來顯示狀態列。可以使用 hl-StatusLine 反白群組來變更此設定。如果狀態列未使用反白顯示,則目前的視窗會使用 '^' 字元,其他視窗則使用 '=' 字元。如果啟用 'mouse',則可以拖曳狀態列來調整視窗大小。
filler-lines
視窗中最後一個緩衝區行之後的行稱為填滿行。預設情況下,這些行以波浪符號 (~) 字元開頭。 'fillchars' 選項中的 "eob" 項目可用來變更此字元。預設情況下,這些字元會反白顯示為 NonText (hl-NonText)。可以使用 EndOfBuffer 反白群組 (hl-EndOfBuffer) 來變更填滿字元的反白顯示。

3. 開啟和關閉視窗 opening-window

CTRL-W s CTRL-W_s
CTRL-W S CTRL-W_S
CTRL-W CTRL-S CTRL-W_CTRL-S
:[N]sp[lit] [++opt] [+cmd] [file] :sp :split 將目前視窗分割成兩個。結果是同一檔案的兩個視圖。
讓新視窗的高度為 N(預設為使用目前視窗高度的一半)。減少目前視窗的高度以建立空間(如果設定了 'equalalways' 選項,且 'eadirection' 不是「hor」,並且其中一個比目前或新視窗高,則會減少其他視窗的高度)。
如果給定 [file],則會在新視窗中編輯它。如果它未載入到任何緩衝區中,則會讀取它。否則,新視窗將使用已載入的緩衝區。
注意: CTRL-S 並非在所有終端機上都有效,且可能會封鎖進一步的輸入,請使用 CTRL-Q 再次開始。另請參閱 ++opt+cmdE242 E1159 在自動指令中分割視窗時請小心,如果當在進行其他視窗配置變更時發生這種情況,可能會搞亂視窗配置。
CTRL-W CTRL-V CTRL-W_CTRL-V
CTRL-W v CTRL-W_v
:[N]vs[plit] [++opt] [+cmd] [file] :vs :vsplit 類似於 :split,但會垂直分割。如果 1. 未指定寬度,2. 設定 'equalalways',3. 'eadirection' 不是「ver」,且 4. 其中一個其他視窗比目前或新視窗寬,則視窗會水平展開。如果給定了 N,則讓新視窗的寬度為 N 個欄,如果可以的話。 注意: 在其他位置,CTRL-QCTRL-V 的作用相同,但在此處則不然!
CTRL-W n CTRL-W_n
CTRL-W CTRL-N CTRL-W_CTRL-N
:[N]new [++opt] [+cmd] :new
建立一個新視窗,並在其中開始編輯一個空白檔案。使新視窗的高度為 N (預設為現有高度的一半)。縮減目前視窗的高度以騰出空間 (如果設定了 'equalalways' 選項,且 'eadirection' 不是 "hor",則也會縮減其他視窗的高度)。另請參閱 ++opt+cmd。如果 'fileformats' 不為空,則將使用給定的第一個格式作為新緩衝區的格式。如果 'fileformats' 為空,則會使用目前緩衝區的 'fileformat'。這可以透過 ++opt 參數覆寫。自動指令會按照下列順序執行:1. 目前視窗的 WinLeave 2. 新視窗的 WinEnter 3. 目前緩衝區的 BufLeave 4. 新緩衝區的 BufEnter。此行為會先像執行 ":split",然後執行 ":enew" 指令。
:[N]new [++opt] [+cmd] {file} :[N]sp[lit] [++opt] [+cmd] {file} :split_f
建立一個新視窗,並在其中開始編輯檔案 {file}。此行為幾乎像先執行 ":split",然後執行 ":edit" 指令,但原始視窗中的備用檔案名稱會設定為 {file}。如果給定 [+cmd],則會在檔案載入後執行該指令 +cmd。另請參閱 ++opt。使新視窗的高度為 N (預設為現有高度的一半)。縮減目前視窗的高度以騰出空間 (如果設定了 'equalalways' 選項,則也會縮減其他視窗的高度)。
:[N]vne[w] [++opt] [+cmd] [file] :vne :vnew:new 類似,但會垂直分割。如果設定了 'equalalways''eadirection' 不是 "ver",除非指定了寬度,否則視窗將會水平展開。
:[N]sv[iew] [++opt] [+cmd] [file] :sv :sview splitview 與 ":split" 相同,但會針對此緩衝區設定 'readonly' 選項。
:[N]sf[ind] [++opt] [+cmd] {file} :sf :sfi :sfind splitfind 與 ":split" 相同,但會像 :find 一樣,在 'path' 中搜尋 {file}。如果找不到 {file},則不會分割。
CTRL-W CTRL-^ CTRL-W_CTRL-^ CTRL-W_^ CTRL-W ^ 將目前視窗分割成兩個,並編輯備用檔案。當給定計數 N 時,分割目前視窗並編輯緩衝區 N。類似於 ":sp #" 和 ":sp #N",但允許另一個緩衝區為未命名。此指令的行為與 CTRL-^ 相同,只是它會先分割視窗。
CTRL-W ge CTRL-W_ge
將目前視窗作為外部視窗分離。僅在使用支援 ui-multigrid 的 UI 時可用。
請注意,'splitbelow''splitright' 選項會影響新視窗將顯示的位置。E36
如果空間不足,則建立視窗將會失敗。每個視窗至少需要一個螢幕行和欄,有時會需要更多。選項 'winminheight''winminwidth' 是相關的。
:vert :vertical :vert[ical] {cmd} 執行 {cmd}。如果其中包含分割視窗的指令,則會垂直分割。對於 vertical wincmd =,視窗只會垂直均分。不適用於 :execute:normal
:hor :horizontal :hor[izontal] {cmd} 執行 {cmd}。目前僅對下列指令有影響
:wincmd =:僅水平均分視窗。
:terminal:在分割視窗中開啟 終端機 緩衝區。
:checkhealth:在分割視窗中開啟健康檢查緩衝區。
:lefta[bove] {cmd} :lefta :leftabove :abo[veleft] {cmd} :abo :aboveleft 執行 {cmd}。如果其中包含分割視窗的指令,則會開啟在目前視窗的左側 (垂直分割) 或上方 (水平分割)。會覆寫 'splitbelow''splitright'。不適用於 :execute:normal
:rightb[elow] {cmd} :rightb :rightbelow :bel[owright] {cmd} :bel :belowright 執行 {cmd}。如果其中包含分割視窗的指令,則會開啟在目前視窗的右側 (垂直分割) 或下方 (水平分割)。會覆寫 'splitbelow''splitright'。不適用於 :execute:normal
:topleft E442 :to[pleft] {cmd} 執行 {cmd}。如果其中包含分割視窗的指令,則會顯示在頂部,並佔用 Vim 視窗的完整寬度。當分割為垂直時,視窗會顯示在最左側,並佔用 Vim 視窗的完整高度。不適用於 :execute:normal
:bo :botright :bo[tright] {cmd} 執行 {cmd}。如果其中包含分割視窗的指令,則會顯示在底部,並佔用 Vim 視窗的完整寬度。當分割為垂直時,視窗會顯示在最右側,並佔用 Vim 視窗的完整高度。不適用於 :execute:normal
這些指令修飾符可以組合使用,使垂直分割的視窗佔用完整高度。範例
:vertical topleft split tags
在 Vim 視窗的最左側,開啟一個垂直分割、全高的視窗,並顯示 "tags" 檔案。

關閉視窗

:q[uit] :{count}q[uit] :count_quit
CTRL-W q CTRL-W_q
CTRL-W CTRL-Q CTRL-W_CTRL-Q
不帶 {count}:關閉目前視窗。如果給定 {count},則關閉第 {count} 個視窗。edit-window
當關閉最後一個編輯視窗 (不包括說明或預覽視窗) 時,會結束 Vim。
當設定了 'hidden',且目前緩衝區只有一個視窗時,該緩衝區會變成隱藏。當未設定 'hidden',且目前緩衝區只有一個視窗,且該緩衝區已變更時,該指令會失敗。(注意:CTRL-Q 並非在所有終端機上都能運作)。如果 [count] 大於最後一個視窗編號,則會關閉最後一個視窗
:1quit  " quit the first window
:$quit  " quit the last window
:9quit  " quit the last window
        " if there are fewer than 9 windows opened
:-quit  " quit the previous window
:+quit  " quit the next window
:+2quit " quit the second next window
當關閉說明視窗,且它不是唯一的視窗時,Vim 會嘗試還原先前的視窗版面配置,請參閱 :helpclose
:q[uit]! :{count}q[uit]! 不帶 {count}:關閉目前視窗。如果給定 {count},則關閉第 {count} 個視窗。如果這是緩衝區的最後一個視窗,則對該緩衝區的所有變更都會遺失。當關閉最後一個視窗 (不包括說明視窗) 時,會結束 Vim。即使設定了 'hidden',也會遺失緩衝區的內容。
:clo[se][!] :{count}clo[se][!] CTRL-W c CTRL-W_c :clo :close 不帶 {count}:關閉目前視窗。如果給定,則關閉第 {count} 個視窗。
當設定了 'hidden' 時,或當緩衝區已變更且使用了 [!] 時,該緩衝區會變成隱藏 (除非有另一個視窗正在編輯它)。
當目前索引標籤頁中只有一個 編輯視窗,且有另一個索引標籤頁時,這會關閉目前的索引標籤頁。索引標籤頁
當下列情況時,此指令會失敗:E444
螢幕上只有一個視窗。
當未設定 'hidden'、未使用 [!]、緩衝區有變更,且此緩衝區上沒有其他視窗時。不會寫入緩衝區的變更,且不會遺失,因此這是一個「安全」的指令。
CTRL-W CTRL-C CTRL-W_CTRL-C
您可能會預期 CTRL-W CTRL-C 會關閉目前視窗,但這不起作用,因為 CTRL-C 會取消指令。
:hide
:hid[e] :{count}hid[e] 不帶 {count}:關閉目前視窗,除非它是螢幕上的最後一個視窗。如果給定 {count},則關閉第 {count} 個視窗。
該緩衝區會變成隱藏 (除非有另一個視窗正在編輯它,或 'bufhidden'unloaddeletewipe)。如果該視窗是目前索引標籤頁中的最後一個視窗,則會關閉該索引標籤頁。索引標籤頁
對於此命令來說,「hidden」的值並不重要。緩衝區的變更不會被寫入,也不會遺失,因此這是一個「安全」的命令。
:hid[e] {cmd} 執行 {cmd} 時,會設定 「hidden」 選項。{cmd} 執行完畢後,會恢復 「hidden」 的先前值。範例
:hide edit Makefile
這將編輯「Makefile」,並在目前緩衝區有任何變更時隱藏它。
:on[ly][!] :{count}on[ly][!] CTRL-W o CTRL-W_o E445 CTRL-W CTRL-O CTRL-W_CTRL-O :on :only 使目前視窗成為螢幕上唯一的視窗。所有其他視窗都會被關閉。關於 {count},請參閱上面的 :quit 命令 :count_quit
當設定 「hidden」 選項時,關閉視窗中的所有緩衝區都會變成隱藏狀態。
當未設定 「hidden」,且設定了 「autowrite」 選項時,已修改的緩衝區會被寫入。否則,除非給定 [!],否則具有已修改緩衝區的視窗不會被移除,然後它們會變成隱藏狀態。但已修改的緩衝區永遠不會被放棄,因此變更不會遺失。
:fc :fclose :[count]fc[lose][!] 關閉 [count] 個具有最高 zindex 值的浮動視窗。 '!' 關閉所有浮動視窗。

4. 將游標移動到其他視窗 window-move-cursor

CTRL-W <Down> CTRL-W_<Down>
CTRL-W CTRL-J CTRL-W_CTRL-J CTRL-W_j CTRL-W j 將游標移動到目前視窗下方第 N 個視窗。使用游標位置在替代方案之間進行選擇。
CTRL-W <Up> CTRL-W_<Up>
CTRL-W CTRL-K CTRL-W_CTRL-K CTRL-W_k CTRL-W k 將游標移動到目前視窗上方第 N 個視窗。使用游標位置在替代方案之間進行選擇。
CTRL-W <Left> CTRL-W_<Left>
CTRL-W CTRL-H CTRL-W_CTRL-H
CTRL-W <BS> CTRL-W_<BS> CTRL-W_h CTRL-W h 將游標移動到目前視窗左邊第 N 個視窗。使用游標位置在替代方案之間進行選擇。
CTRL-W <Right> CTRL-W_<Right>
CTRL-W CTRL-L CTRL-W_CTRL-L CTRL-W_l CTRL-W l 將游標移動到目前視窗右邊第 N 個視窗。使用游標位置在替代方案之間進行選擇。
CTRL-W w CTRL-W_w CTRL-W_CTRL-W CTRL-W CTRL-W 沒有計數:將游標移動到目前視窗下方/右邊的可聚焦視窗。如果下方或右邊沒有(可聚焦的)視窗,則移動到左上角的視窗。有計數:移動到第 N 個視窗(視窗從左上到右下編號)。要取得視窗編號,請參閱 bufwinnr()winnr()。當 N 大於視窗數量時,會移動到最後一個視窗。
CTRL-W_W
CTRL-W W 沒有計數:將游標移動到目前視窗上方/左邊的可聚焦視窗。如果上方或左邊沒有視窗,則移動到右下角的視窗。有計數:移動到第 N 個視窗,就像使用 CTRL-W w 一樣。
CTRL-W t CTRL-W_t CTRL-W_CTRL-T CTRL-W CTRL-T 將游標移動到左上角的視窗。
CTRL-W b CTRL-W_b CTRL-W_CTRL-B CTRL-W CTRL-B 將游標移動到右下角的視窗。
CTRL-W p CTRL-W_p CTRL-W_CTRL-P CTRL-W CTRL-P 移動到上一個(最後存取的)視窗。
CTRL-W_P E441 CTRL-W P 移動到預覽視窗。當沒有預覽視窗時,會出現錯誤。
如果視覺模式處於活動狀態,且新視窗不是用於相同的緩衝區,則視覺模式會結束。如果視窗位於相同的緩衝區上,則游標位置會設定為保持選取相同的視覺區域。
:winc :wincmd 這些命令也可以使用「:wincmd」執行
:[count]winc[md] {arg} :winc[md] [count] {arg} 就像執行 CTRL-W [count] {arg} 一樣。範例
:wincmd j
移動到目前視窗下方的視窗。當無法使用一般模式時(對於 CursorHold 自動命令事件),此命令很有用。或者當一般模式命令不方便時。計數也可以是視窗編號。範例
:exe nr .. "wincmd w"
這會移動到視窗「nr」。
注意:所有 CTRL-W 命令也可以使用 :wincmd 執行,用於無法使用一般模式命令或不方便使用一般模式命令的地方(例如,在基於瀏覽器的終端機中)。

5. 移動視窗 window-moving

CTRL-W r CTRL-W_r CTRL-W_CTRL-R E443 CTRL-W CTRL-R 向下/向右旋轉視窗。第一個視窗變成第二個,第二個變成第三個,依此類推。最後一個視窗變成第一個視窗。游標會保持在同一個視窗中。這僅在目前視窗所在的視窗列或欄中起作用。
CTRL-W_R
CTRL-W R 向上/向左旋轉視窗。第二個視窗變成第一個,第三個變成第二個,依此類推。第一個視窗變成最後一個視窗。游標會保持在同一個視窗中。這僅在目前視窗所在的視窗列或欄中起作用。
CTRL-W x CTRL-W_x CTRL-W_CTRL-X CTRL-W CTRL-X 沒有計數:將目前視窗與下一個視窗交換。如果沒有下一個視窗,則與上一個視窗交換。有計數:將目前視窗與第 N 個視窗交換(第一個視窗為 1)。游標會放置在另一個視窗中。當垂直和水平視窗分割混合時,交換僅在目前視窗所在的視窗列或欄中執行。
以下命令可用於變更視窗佈局。例如,當有兩個垂直分割的視窗時,CTRL-W K 會將其變更為水平分割的視窗。CTRL-W H 會以相反的方式執行。
CTRL-W_K
CTRL-W K 將目前視窗移動到最頂端,使用螢幕的完整寬度。這就像 :topleft split,只是它適用於目前視窗,且不會建立新視窗。
CTRL-W_J
CTRL-W J 將目前視窗移動到最底端,使用螢幕的完整寬度。這就像 :botright split,只是它適用於目前視窗,且不會建立新視窗。
CTRL-W_H
CTRL-W H 將目前視窗移動到最左邊,使用螢幕的完整高度。這就像 :vert topleft split,只是它適用於目前視窗,且不會建立新視窗。
CTRL-W_L
CTRL-W L 將目前視窗移動到最右邊,使用螢幕的完整高度。這就像 :vert botright split,只是它適用於目前視窗,且不會建立新視窗。
CTRL-W_T
CTRL-W T 將目前視窗移動到新的標籤頁面。如果目前標籤頁面中只有一個視窗,則此操作會失敗。這就像 :tab split,只是會關閉先前的視窗。當指定計數時,新標籤頁面將在此索引的標籤頁面之前開啟。否則,它會在目前標籤頁面之後開啟。

6. 調整視窗大小 window-resize

CTRL-W_=
CTRL-W = 使所有視窗的高度和寬度(幾乎)相等,但將 「winheight」「winwidth」 用於目前視窗。設定了 「winfixheight」 的視窗會保持其高度,而設定了 「winfixwidth」 的視窗會保持其寬度。若僅垂直對齊(使視窗高度相等),請使用 vertical wincmd =。若僅水平對齊(使視窗寬度相等),請使用 horizontal wincmd =
: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(預設:最大可能值)。
:{winnr}res[ize] [+-]N 就像上面的 :resize,但將大小套用至視窗 {winnr} 而不是目前視窗。
z{nr}<CR> 將目前視窗高度設定為 {nr}
CTRL-W_<
CTRL-W < 將目前視窗寬度減少 N(預設為 1)。
CTRL-W_>
CTRL-W > 將目前視窗寬度增加 N(預設為 1)。
:vert[ical] res[ize] [N] :vertical-resize CTRL-W_bar CTRL-W | 將目前視窗寬度設定為 N(預設:最大可能值)。
您也可以使用滑鼠向上或向下拖曳狀態列來調整視窗大小。或者向左或向右拖曳垂直分隔線。這僅在正在使用的 Vim 版本支援滑鼠且 「mouse」 選項已設定為啟用時才起作用。
選項 'winheight' ('wh') 用於設定目前視窗的最小高度。每次有另一個視窗成為目前視窗時,都會使用這個選項。如果選項值為 '0',則會停用此功能。將 'winheight' 設定為非常大的值,例如 '9999',可使目前視窗始終填滿所有可用空間。將其設定為合理的值,例如 '10',可使在目前視窗中編輯時感到舒適。
對應的 'winwidth' ('wiw') 選項用於設定目前視窗的最小寬度。
當選項 'equalalways' ('ea') 設定後,分割或關閉視窗後,所有視窗都會自動調整為相同的大小。如果您不設定此選項,分割視窗會縮小目前視窗的大小,而其他視窗保持不變。關閉視窗時,多餘的行會給予上方的視窗。
'eadirection' 選項會限制 'equalalways' 選項的應用方向。預設值 "both" 會在兩個方向調整大小。當值為 "ver" 時,只會將視窗的高度調整為相等。當您手動調整垂直分割視窗的大小並想保持此寬度時,請使用此設定。同樣地,"hor" 只會使視窗的寬度相等。
選項 'cmdheight' ('ch') 用於設定命令列的高度。如果您對長訊息出現 hit-enter 提示感到厭煩,請將此選項設定為 2 或 3。
如果只有一個視窗,調整該視窗的大小也會變更命令列的高度。如果有數個視窗,調整目前視窗的大小也會變更其下方視窗的高度(有時也會變更其上方視窗的高度)。
視窗的最小高度和寬度由 'winminheight''winminwidth' 設定。這些是硬性值,視窗永遠不會變得更小。
WinScrolled 和 WinResized 自動指令
win-scrolled-resized
如果您想在視窗大小變更時收到通知,可以使用 WinResized 自動指令事件。如果您想在視窗中的文字垂直或水平滾動時收到通知,可以使用 WinScrolled 自動指令事件。這也會在視窗大小變更時觸發。例外情況:當文字因 'incsearch' 而滾動時,不會觸發事件。WinResized-event
WinResized 事件會在更新顯示後觸發,此時可能有數個視窗的大小已變更。v:event.windows 變數中提供自上次以來變更大小的視窗 ID 清單,例如:[1003, 1006]WinScrolled-event
WinScrolled 事件會在 WinResized 之後觸發,如果視窗滾動也會觸發。可能是垂直滾動(視窗頂端的文字已變更)或水平滾動(當 'wrap' 關閉或第一行的第一個顯示部分變更時)。請注意,WinScrolled 的觸發次數會比 WinResized 多很多,這可能會稍微減慢編輯速度。
WinScrolled 提供的資訊是每個變更視窗的字典,使用視窗 ID 作為鍵,並使用鍵 "all" 表示變更的總計數。v:event 的範例值
{
   all: {width: 0, height: 2, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
   1003: {width: 0, height: -1, leftcol: 0, skipcol: 0, topline: 0, topfill: 0},
   1006: {width: 0, height: 1, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
}
請注意,"all" 項目具有累積的個別視窗絕對值。
如果您需要有關變更的更多資訊,或者想要「去抖動」事件(不要處理每個事件以避免執行太多工作),您可能需要使用 winlayout()getwininfo() 函數。
WinScrolledWinResized 不會在新增第一個自動指令時觸發,只會在第一次滾動或調整大小後觸發。它們可能會在切換到另一個索引標籤頁面時觸發。
執行的命令預期不會導致視窗大小或滾動變更。如果確實發生這種情況,事件將很快再次觸發。換句話說:在觸發事件之前,會儲存目前的大小和滾動位置,並用來判斷是否發生變更。

7. 引數和緩衝區清單命令 buffer-list

args 清單 buffer 清單 意義
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 個修改的緩衝區
分割 & args 清單 分割 & 緩衝區清單 意義
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] 的意義取決於命令:[N] 是在 2/12/22/32、3/13/23/33 和 4/14/24/34 上向前/向後移動的緩衝區數量。[N] 是引數編號,預設為目前引數,適用於 1 和 21。[N] 是緩衝區編號,預設為目前緩衝區,適用於 11 和 31。[N] 是 19 和 39 的計數。
注意: ":next" 是一個例外,因為它必須接受一個檔案名稱清單才能與 Vi 相容。

引數清單和多個視窗

每個視窗在引數清單中的目前位置可以不同。請記住,當執行 ":e file" 時,引數清單中的位置保持不變,但您並未編輯該位置的檔案。為了表示這一點,檔案訊息(以及標題,如果有標題)會顯示「(file (N) of M)」,其中「(N)」是檔案清單中的目前位置,「M」是檔案清單中的檔案數。
引數清單中的所有項目都會新增至緩衝區清單。因此,您也可以使用緩衝區清單命令(例如 ":bnext")來存取它們。
:[N]al[l][!] [N] :al :all :sal :sall :[N]sal[l][!] [N] 重新排列畫面,為每個引數開啟一個視窗。所有其他視窗都會關閉。給定計數時,這是要開啟的最大視窗數。使用 :tab 修飾符會為每個引數開啟一個索引標籤頁面。當引數數量超過 'tabpagemax' 時,其他引數會成為最後一個索引標籤頁面中的分割視窗。當設定 'hidden' 選項時,關閉視窗中的所有緩衝區都會變成隱藏狀態。當未設定 'hidden' 且設定 'autowrite' 選項時,會寫入已修改的緩衝區。否則,除非給定 [!],否則不會移除具有已修改緩衝區的視窗,然後它們會變成隱藏狀態。但永遠不會放棄修改過的緩衝區,因此變更不會遺失。[N] 是要開啟的最大視窗數。'winheight' 也會限制開啟的視窗數(如果前面加上 :vertical,則為 'winwidth')。Buf/Win Enter/Leave 自動指令不會在此處的新視窗中執行,只有在真正進入時才會執行。如果自動指令在此命令忙碌時變更視窗版面配置,則會產生錯誤。E249
:[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
:sre :srewind :sre[wind][!] [++opt] [+cmd] 簡寫為 ":split | rewind": 分割視窗並跳至第一個引數。但是,如果沒有引數清單,則不會分割視窗。另請參閱 ++opt+cmd
:sfir :sfirst :sfir[st] [++opt] [+cmd] 與 ":srewind" 相同。
:sla :slast :sla[st][!] [++opt] [+cmd] 簡寫為 ":split | last": 分割視窗並跳至最後一個引數。但是,如果沒有引數清單,則不會分割視窗。另請參閱 ++opt+cmd
:dr :drop :dr[op] [++opt] [+cmd] {file} .. 在視窗中編輯第一個 {file}
如果檔案已在視窗中開啟,請變更為該視窗。
如果檔案未在視窗中開啟,請在目前視窗中編輯該檔案。如果無法放棄目前的緩衝區,則會先分割視窗。
如果可能,會關閉不在引數清單中或不是全寬的視窗。引數清單會像使用 :next 命令一樣設定。此命令的目的是可以從想要 Vim 編輯另一個檔案的程式(例如偵錯工具)中使用。當使用 :tab 修飾符時,每個引數都會在索引標籤頁面中開啟。如果最後一個視窗為空,則會使用最後一個視窗。另請參閱 ++opt+cmd

8. 在所有緩衝區或視窗中執行命令 list-repeat

:windo
:[range]windo {cmd} 在每個可聚焦的視窗中執行 {cmd},或僅針對給定 [range] 視窗編號中的視窗執行。它的運作方式如下:
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
etc.
此操作僅在目前的索引標籤頁面中執行。如果在一個視窗上偵測到錯誤,則不會存取其他視窗。最後一個視窗(或發生錯誤的位置)會成為目前的視窗。{cmd} 可以包含 '|' 來串連數個命令。{cmd} 不得開啟或關閉視窗或重新排序它們。
另請參閱 :tabdo:argdo:bufdo:cdo:ldo:cfdo:lfdo
:bufdo
:[range]bufdo[!] {cmd} 在緩衝區列表中的每個緩衝區執行 {cmd},如果給定 [range],則僅針對緩衝區編號在 [range] 中的緩衝區執行。它的作用類似於執行以下操作:
:bfirst
:{cmd}
:bnext
:{cmd}
etc.
當目前檔案無法放棄,且沒有 [!] 時,該命令會失敗。當在某個緩衝區中偵測到錯誤時,將不會造訪後續的緩衝區。未列出的緩衝區會被跳過。最後一個緩衝區(或發生錯誤的緩衝區)會成為目前的緩衝區。 {cmd} 可以包含 '|' 來串連多個命令。 {cmd} 不得刪除緩衝區或將緩衝區新增至緩衝區列表。注意: 當此命令正在執行時,語法自動命令事件會被停用,方法是將其新增至 'eventignore'。這會大幅加快編輯每個緩衝區的速度。
另請參閱 :tabdo:argdo:windo:cdo:ldo:cfdo:lfdo
範例
:windo set nolist foldcolumn=0 | normal! zn
這會重設所有視窗中的 'list' 選項並停用摺疊。
:bufdo set fileencoding= | update
這會重設每個緩衝區中的 'fileencoding',並且如果這變更了緩衝區,則會寫入它。結果是所有緩衝區都會使用 'encoding' 編碼(如果轉換成功)。

9.游標下的標籤或檔案名稱 window-tag

:sta :stag :sta[g][!] [標籤名稱] 執行 ":tag[!] [標籤名稱]",並分割視窗以顯示找到的標籤。另請參閱 :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 gf",但如果檔案不存在,則不會分割視窗。使用 'path' 變數作為尋找檔案的目錄名稱列表。也會使用目前檔案的路徑來搜尋檔案名稱。如果名稱是類似 "type://machine/path" 的超文字連結,則只會使用 "/path"。如果給定計數,則會編輯第 count 個相符的檔案。
CTRL-W F CTRL-W_F
將目前視窗分割為兩個。編輯游標下的檔案名稱,並跳轉到檔案名稱後面的行號。有關如何取得行號的詳細資訊,請參閱 gF
CTRL-W gf CTRL-W_gf
開啟新的索引標籤頁面,並編輯游標下的檔案名稱。類似於 "tab split" 和 "gf",但如果檔案不存在,則不會建立新的索引標籤頁面。
CTRL-W gF CTRL-W_gF
開啟新的索引標籤頁面,並編輯游標下的檔案名稱,並跳轉到檔案名稱後面的行號。類似於 "tab split" 和 "gF",但如果檔案不存在,則不會建立新的索引標籤頁面。
CTRL-W gt CTRL-W_gt
前往下一個索引標籤頁面,與 gt 相同。
CTRL-W gT CTRL-W_gT
前往上一個索引標籤頁面,與 gT 相同。
另請參閱 CTRL-W_CTRL-I:為包含游標下關鍵字的包含檔案開啟視窗。

10.預覽視窗 preview-window

預覽視窗是用於顯示(預覽)另一個檔案的特殊視窗。它通常是一個小視窗,用於顯示包含檔案或函式的定義。
每個索引標籤頁面只能有一個預覽視窗。它是使用以下其中一個命令建立的。'previewheight' 選項可以設定為指定預覽視窗開啟時的高度。'previewwindow' 選項會在預覽視窗中設定,以使其能夠被識別。'winfixheight' 選項會設定為使其在開啟/關閉其他視窗時保持相同的高度。
:pta :ptag :pta[g][!] [標籤名稱] 執行 ":tag[!] [標籤名稱]",並在「預覽」視窗中顯示找到的標籤,而不會變更目前的緩衝區或游標位置。如果「預覽」視窗已存在,則會重複使用它(就像說明視窗一樣)。如果開啟新的視窗,則會使用 'previewheight' 作為視窗的高度。另請參閱 :tag。範例請參閱下方。CursorHold-example:tag 的小差異:當 [標籤名稱] 等於已顯示的標籤時,不會重設相符標籤清單中的位置。這使得 CursorHold 範例在 :ptnext 之後可以運作。
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
CTRL-W } CTRL-W_}
使用游標下的識別符號作為標籤,並對其執行 :ptag。建立新的預覽視窗(如果需要),高度為 N。如果沒有給定 N,則會使用 'previewheight'
CTRL-W g } CTRL-W_g}
使用游標下的識別符號作為標籤,並對其執行 :ptjump。建立新的預覽視窗(如果需要),高度為 N。如果沒有給定 N,則會使用 'previewheight'
:ped :pedit :ped[it][!] [++opt] [+cmd] {檔案} 在預覽視窗中編輯 {檔案}。預覽視窗會像使用 :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>")
這會導致當游標在以 'updatetime' 設定的時間內沒有移動時,對游標下的關鍵字執行 ":ptag"。"++nested" 會使其他自動命令執行,以便語法醒目提示在預覽視窗中運作。"silent!" 會避免在找不到標籤時顯示錯誤訊息。另請參閱 CursorHold。若要再次停用此功能
:au! CursorHold
一個很好的補充是醒目提示找到的標籤,避免在游標下沒有單字時執行 ":ptag",以及其他一些事情
:au! CursorHold *.[ch] ++nested call PreviewWord()
:func PreviewWord()
:  if &previewwindow                        " don't do this in the preview window
:    return
:  endif
:  let w = expand("<cword>")                " get the word under cursor
:  if w =~ '\a'                        " if the word contains a letter
:
:    " Delete any existing highlight before showing another tag
:    silent! wincmd P                        " jump to preview window
:    if &previewwindow                " if we really get there...
:      match none                        " delete existing highlight
:      wincmd p                        " back to old window
:    endif
:
:    " Try displaying a matching tag for the word under the cursor
:    try
:       exe "ptag " .. w
:    catch
:      return
:    endtry
:
:    silent! wincmd P                        " jump to preview window
:    if &previewwindow                " if we really get there...
:         if has("folding")
:           silent! .foldopen                " don't want a closed fold
:         endif
:         call search("$", "b")                " to end of previous line
:         let w = substitute(w, '\\', '\\\\', "")
:         call search('\<\V' .. w .. '\>')        " position cursor on match
:         " Add a match highlight to the word at this position
:      hi previewWord term=bold ctermbg=green guibg=green
:         exe 'match previewWord "\%' .. line(".") .. 'l\%' .. col(".") .. 'c\k*"'
:      wincmd p                        " back to old window
:    endif
:  endif
:endfun

11.使用隱藏的緩衝區 buffer-hidden

隱藏的緩衝區不會顯示在視窗中,但仍然會載入到記憶體中。這使得您可以從一個檔案跳轉到另一個檔案,而無需在每次取得視窗中的另一個緩衝區時讀取或寫入檔案。
:buffer-!
如果設定選項 'hidden' ('hid'),則會保留放棄的緩衝區,以用於所有開始編輯另一個檔案的命令:「:edit」、「:next」、「:tag」等。當緩衝區被修改,但強制(使用 '!')從視窗中移除,且 'autowrite' 關閉或無法寫入緩衝區時,即使未設定 'hidden' 選項,在緩衝區列表中移動的命令有時也會使目前的緩衝區隱藏。
您可以藉由使用任何命令開始編輯隱藏的緩衝區,或使用 ":bdelete" 命令刪除它,使隱藏的緩衝區不再隱藏。
'hidden' 是全域性的,它用於所有緩衝區。'bufhidden' 選項可用於針對特定緩衝區建立例外。它可以採用以下值: <empty> 使用 'hidden' 的值。hide 隱藏此緩衝區,即使未設定 'hidden'。unload 不要隱藏而是卸載此緩衝區,即使設定了 'hidden'。delete 刪除緩衝區。
hidden-quit
當您嘗試在有隱藏的、修改過的緩衝區時退出 Vim,您會收到錯誤訊息,並且 Vim 會將該緩衝區設為目前的緩衝區。然後,您可以決定寫入此緩衝區 (":wq") 或在不寫入的情況下退出 (":q!")。請小心:可能會有更多隱藏的、修改過的緩衝區!
緩衝區也可以不列出。這表示它存在,但不在緩衝區列表中。unlisted-buffer
:files[!] [旗標] :files
:buffers[!] [旗標] :buffers :ls :ls[!] [旗標] 顯示所有緩衝區。範例
1 #h "/test/text" 第 1 行
2u "asdf" 第 0 行
3 %a + "version.c" 第 1 行
當包含 [!] 時,清單會顯示未列出的緩衝區(「未列出」這個詞會有點混淆...)。
每個緩衝區都有一個獨特的編號。這個編號不會改變,因此您總是可以使用 ":buffer N" 或 "N CTRL-^" 來前往特定的緩衝區,其中 N 是緩衝區編號。
指示符(同一列中的字元互斥):u 未列出的緩衝區(僅在使用 [!] 時顯示)未列出的緩衝區 % 目前視窗中的緩衝區 # ":e #" 和 CTRL-^ 的替代緩衝區 a 活動的緩衝區:它已載入且可見 h 隱藏的緩衝區:它已載入,但目前未在視窗中顯示 隱藏的緩衝區 - 'modifiable' 關閉的緩衝區 = 唯讀緩衝區 R 具有執行中作業的終端緩衝區 F 具有已完成作業的終端緩衝區 ? 沒有作業的終端緩衝區::terminal NONE + 已修改的緩衝區 x 具有讀取錯誤的緩衝區
[flags] 可以是以下字元的組合,這些字元限制要列出的緩衝區:+ 已修改的緩衝區 - 'modifiable' 關閉的緩衝區 = 唯讀緩衝區 a 活動的緩衝區 u 未列出的緩衝區(覆蓋 "!")h 隱藏的緩衝區 x 具有讀取錯誤的緩衝區 % 目前緩衝區 # 替代緩衝區 R 具有執行中作業的終端緩衝區 F 具有已完成作業的終端緩衝區 t 顯示上次使用時間並排序緩衝區 組合旗標表示它們是 "and" 運算,例如:h+ 隱藏的且已修改的緩衝區 a+ 活動的且已修改的緩衝區
當使用 :filter 時,模式會與顯示的緩衝區名稱進行比對,例如
filter /\.vim/ ls
:bad :badd :bad[d] [+lnum] {fname} 將檔案名稱 {fname} 加入緩衝區列表,如果尚未列出,則不會載入。如果緩衝區先前已刪除,而不是清除,則會再次列出。如果指定 "lnum",則在首次進入緩衝區時,游標將定位在該行。請注意,+ 後面的其他命令將被忽略。
:balt
:balt [+lnum] {fname} 類似於 :badd,並且將目前視窗的替代檔案設定為 {fname}
:[N]bd[elete][!] :bd :bdel :bdelete E516 :bd[elete][!] [N] 卸載緩衝區 [N](預設:目前緩衝區)並從緩衝區列表中刪除它。如果緩衝區已變更,則此操作會失敗,除非指定了 [!],在這種情況下,變更會遺失。該檔案不受影響。此緩衝區的任何視窗都會關閉。如果緩衝區 [N] 是目前緩衝區,則會改為顯示另一個緩衝區。這是跳躍列表中指向已載入緩衝區的最近項目。實際上,緩衝區並未完全刪除,而是從緩衝區列表中移除 未列出的緩衝區,並且會清除緩衝區的選項值、變數和對應/縮寫。範例
:.,$-bdelete   "delete buffers from the current one to
               " last but one
:%bdelete      " delete all buffers
:bdelete[!] {bufname} E93 E94 類似於 ":bdelete[!] [N]",但緩衝區由名稱給定,請參閱 {bufname}
:bdelete[!] N1 N2 ... 對於緩衝區 N1、N2 等執行 ":bdelete[!]"。引數可以是緩衝區編號或緩衝區名稱(但不能是身為數字的緩衝區名稱)。在緩衝區名稱中的空格前插入反斜線。
:N,Mbdelete[!] 對於範圍 N 到 M 中的所有緩衝區執行 ":bdelete[!]" 包含
:[N]bw[ipeout][!] :bw :bwipe :bwipeout E517 :bw[ipeout][!] {bufname} :N,Mbw[ipeout][!] :bw[ipeout][!] N1 N2 ... 類似於 :bdelete,但實際上是刪除緩衝區。所有與緩衝區相關的內容都會遺失。此緩衝區中的所有標記都會失效,選項設定會遺失,跳躍列表和標籤堆疊資料將被清除等等。除非您知道自己在做什麼,否則請勿使用此命令。範例
:.+,$bwipeout   " wipe out all buffers after the current
                " one
:%bwipeout            " wipe out all buffers
:[N]bun[load][!] :bun :bunload E515 :bun[load][!] [N] 卸載緩衝區 [N](預設:目前緩衝區)。為此緩衝區配置的記憶體將被釋放。緩衝區仍保留在緩衝區列表中。如果緩衝區已變更,則此操作會失敗,除非指定了 [!],在這種情況下,變更會遺失。此緩衝區的任何視窗都會關閉。如果緩衝區 [N] 是目前緩衝區,則會改為顯示另一個緩衝區。這是跳躍列表中指向已載入緩衝區的最近項目。
:bunload[!] {bufname} 類似於 ":bunload[!] [N]",但緩衝區由名稱給定。另請參閱 {bufname}
:N,Mbunload[!] 對於範圍 N 到 M 中的所有緩衝區執行 ":bunload[!]" 包含
:bunload[!] N1 N2 ... 對於緩衝區 N1、N2 等執行 ":bunload[!]"。引數可以是緩衝區編號或緩衝區名稱(但不能是身為數字的緩衝區名稱)。在緩衝區名稱中的空格前插入反斜線。
:[N]b[uffer][!] [+cmd] [N] :b :bu :buf :buffer E86 編輯緩衝區列表中編號為 [N] 的緩衝區。如果未給定 [N],則仍會編輯目前緩衝區。請參閱 :buffer-! 以了解 [!]。這也會編輯不在緩衝區列表中的緩衝區,而不會設定 'buflisted' 旗標。另請參閱 +cmd
:[N]b[uffer][!] [+cmd] {bufname} {bufname}
從緩衝區列表中編輯 {bufname} 的緩衝區。部分名稱也有效,只要它在緩衝區列表中是唯一的。請注意,名稱為數字的緩衝區不能使用該名稱來參照;請改用緩衝區編號。在緩衝區名稱中的空格前插入反斜線。請參閱 :buffer-! 以了解 [!]。這也會編輯不在緩衝區列表中的緩衝區,而不會設定 'buflisted' 旗標。另請參閱 +cmd
:[N]sb[uffer] [+cmd] [N] :sb :sbuffer 分割視窗並從緩衝區列表中編輯緩衝區 [N]。如果未給定 [N],則會編輯目前緩衝區。分割時會考量 'switchbuf' 的 "useopen" 設定。這也會編輯不在緩衝區列表中的緩衝區,而不會設定 'buflisted' 旗標。另請參閱 +cmd
:[N]sb[uffer] [+cmd] {bufname} 分割視窗並從緩衝區列表中編輯 {bufname} 的緩衝區。這也會編輯不在緩衝區列表中的緩衝區,而不會設定 'buflisted' 旗標。 注意: 如果您想要做的是分割緩衝區,並以另一個名稱建立副本,則可以使用這種方式
:w foobar | sp #
另請參閱 +cmd
:[N]bn[ext][!] [+cmd] [N] :bn :bnext [b E87 前往緩衝區列表中第 [N] 個下一個緩衝區。[N] 預設為 1。會環繞緩衝區列表的末尾。請參閱 :buffer-! 以了解 [!]。另請參閱 +cmd。如果您在說明緩衝區中,這會將您帶到下一個說明緩衝區(如果有的話)。同樣地,如果您在正常的(非說明)緩衝區中,這會將您帶到下一個正常緩衝區。這是為了當您呼叫說明時,它不會在您瀏覽程式碼/文字緩衝區時造成干擾。接下來的三個命令也以這種方式運作。
:sbn :sbnext :[N]sbn[ext] [+cmd] [N] 分割視窗並前往緩衝區列表中第 [N] 個下一個緩衝區。會環繞緩衝區列表的末尾。使用 'switchbuf' 另請參閱 +cmd
:[N]bN[ext][!] [+cmd] [N] :bN :bNext :bp :bprevious ]b E88 :[N]bp[revious][!] [+cmd] [N] 前往緩衝區列表中第 [N] 個上一個緩衝區。[N] 預設為 1。會環繞緩衝區列表的開頭。請參閱 :buffer-! 以了解 [!] 和 'switchbuf'。另請參閱 +cmd
:[N]sbN[ext] [+cmd] [N] :sbN :sbNext :sbp :sbprevious :[N]sbp[revious] [+cmd] [N] 分割視窗並前往緩衝區列表中第 [N] 個上一個緩衝區。會環繞緩衝區列表的開頭。使用 'switchbuf'。另請參閱 +cmd
:br[ewind][!] [+cmd] :br :bre :brewind [B 前往緩衝區列表中的第一個緩衝區。如果緩衝區列表為空,則前往第一個未列出的緩衝區。請參閱 :buffer-! 以了解 [!]。
:bf[irst] [+cmd] :bf :bfirst:brewind 相同。另請參閱 +cmd
:sbr[ewind] [+cmd] :sbr :sbrewind 分割視窗並前往緩衝區列表中的第一個緩衝區。如果緩衝區列表為空,則前往第一個未列出的緩衝區。考量 'switchbuf' 選項。另請參閱 +cmd
:sbf[irst] [+cmd] :sbf :sbfirst 與 ":sbrewind" 相同。
:bl[ast][!] [+cmd] :bl :blast ]B 移動到緩衝區列表中的最後一個緩衝區。如果緩衝區列表為空,則移動到最後一個未列出的緩衝區。關於 [!] 請參閱 :buffer-!
:sbl[ast] [+cmd] :sbl :sblast 分割視窗並移動到緩衝區列表中的最後一個緩衝區。如果緩衝區列表為空,則移動到最後一個未列出的緩衝區。遵守 'switchbuf' 選項。
:[N]bm[odified][!] [+cmd] [N] :bm :bmodified E84 移動到第 [N] 個下一個已修改的緩衝區。 注意:此命令也會尋找未列出的緩衝區。如果沒有已修改的緩衝區,則命令失敗。
:[N]sbm[odified] [+cmd] [N] :sbm :sbmodified 分割視窗並移動到第 [N] 個下一個已修改的緩衝區。遵守 'switchbuf' 選項。 注意:此命令也會尋找不在緩衝區列表中的緩衝區。
:[N]unh[ide] [N] :unh :unhide :sun :sunhide :[N]sun[hide] [N] 重新排列畫面,為緩衝區列表中每個已載入的緩衝區開啟一個視窗。當給定計數時,這是要開啟的最大視窗數。
:[N]ba[ll] [N] :ba :ball :sba :sball :[N]sba[ll] [N] 重新排列畫面,為緩衝區列表中每個緩衝區開啟一個視窗。當給定計數時,這是要開啟的最大視窗數。'winheight' 也限制了開啟的視窗數量(如果預先加上 :vertical,則為 'winwidth')。Buf/Win Enter/Leave 自動指令不會在此處為新視窗執行,僅當它們真正進入時才會執行。當使用 :tab 修飾符時,會在新的標籤頁中開啟新視窗,最多到 'tabpagemax'
注意:所有以上開始編輯另一個緩衝區的命令,都會保留 'readonly' 標誌的原本狀態。這與 ":edit" 命令不同,後者每次讀取檔案時都會設定 'readonly' 標誌。

12. 特殊類型的緩衝區 special-buffers

除了包含檔案的文字,緩衝區也可以用於其他目的。可以設定一些選項來變更緩衝區的行為:'bufhidden' 當緩衝區不再顯示在視窗中時會發生什麼事。'buftype' 這是一種什麼類型的緩衝區 'swapfile' 緩衝區是否會使用交換檔 'buflisted' 緩衝區是否顯示在緩衝區列表中
一些有用的緩衝區類型
quickfix 用於包含錯誤列表或位置列表。請參閱 :cwindow:lwindow。此命令將 'buftype' 選項設定為 "quickfix"。你不應該變更此設定!'swapfile' 已關閉。
help 包含說明檔案。只會透過 :help 命令建立。表示說明緩衝區的標誌是內部的且無法變更。'buflisted' 選項將針對說明緩衝區重置。
terminal 終端視窗緩衝區,請參閱 terminal。在工作結束前,無法讀取或變更內容。
directory 顯示目錄內容。可由檔案瀏覽器外掛程式使用。緩衝區會以這些設定建立
:setlocal buftype=nowrite
:setlocal bufhidden=delete
:setlocal noswapfile
緩衝區名稱是目錄的名稱,並在使用 :cd 命令時進行調整。
scratch-buffer
scratch 包含可以隨時捨棄的文字。關閉視窗時會保留,必須明確刪除。設定
:setlocal buftype=nofile
:setlocal bufhidden=hide
:setlocal noswapfile
如果您為緩衝區指定有意義的名稱,則可以使用緩衝區名稱來識別緩衝區。
unlisted-buffer
unlisted 緩衝區不在緩衝區列表中。它不適用於一般的編輯,而是用於顯示說明檔案、記住檔案名稱或標記。":bdelete" 命令也會設定此選項,因此它不會完全刪除緩衝區。設定
:setlocal nobuflisted
主要
命令索引
快速參考