視窗
Nvim 的 :help
頁面,使用 tree-sitter-vimdoc 解析器,從 來源 產生。
這裡解釋了新增用來使用多個視窗和緩衝區的命令。此外,還有說明當與多個視窗組合使用時,行為不同的命令。
摘要:緩衝區是檔案在記憶體中的文字。視窗是緩衝區的視圖。標籤頁是視窗的集合。
視窗是緩衝區的視圖。您可以在一個緩衝區上使用多個視窗,或在不同的緩衝區上使用多個視窗。
緩衝區是載入到記憶體中進行編輯的檔案。在您將緩衝區寫入檔案之前,原始檔案保持不變。
緩衝區可以處於以下三種狀態之一
active-buffer 活動 (active):緩衝區顯示在視窗中。如果此緩衝區有檔案,則該檔案已讀入緩衝區。從那時起,緩衝區可能已被修改,因此與檔案不同。
hidden-buffer隱藏 (hidden):緩衝區未顯示。如果此緩衝區有檔案,則該檔案已讀入緩衝區。否則,它與活動緩衝區相同,您只是看不到它。
inactive-buffer非活動 (inactive):緩衝區未顯示,且不包含任何內容。如果檔案曾經載入,則會記住緩衝區的選項。它可以包含來自
shada 檔案的標記。但緩衝區不包含文字。
以表格呈現
狀態 顯示 已載入 ":buffers"
在視窗中 顯示
活動 是 是 'a' 隱藏 否 是 'h' 非活動 否 否 ' '
buffer-reuse 每個緩衝區都有一個唯一的編號,且該編號在 Vim 會話中不會更改。可以使用
bufnr() 和
bufname() 函數在緩衝區名稱和緩衝區編號之間進行轉換。有一個例外:如果建立新的空緩衝區且未修改,則將另一個檔案載入該緩衝區時,將會重複使用該緩衝區。這也表示緩衝區編號不會更改。
主要的 Vim 視窗可以容納多個分割視窗。還有標籤頁
tab-page,每個標籤頁可以容納多個視窗。
預設情況下,Vim 會像 Vi 一樣以一個視窗啟動。
Vim 的 "-o" 和 "-O" 引數可用來為引數列表中的每個檔案開啟一個視窗。"-o" 引數會水平分割視窗;"-O" 引數會垂直分割視窗。如果同時給定 "-o" 和 "-O",則會使用最後遇到的引數來判斷分割方向。例如,這將開啟三個水平分割的視窗
vim -o file1 file2 file3
"-oN",其中 N 是十進位數字,會開啟 N 個水平分割的視窗。如果檔案名稱多於視窗,則僅開啟 N 個視窗,並且某些檔案不會取得視窗。如果視窗多於檔案名稱,則最後幾個視窗將編輯空的緩衝區。同樣,"-ON" 會開啟 N 個垂直分割的視窗,且具有相同的限制。
開啟新視窗並讀取檔案時,不會執行緩衝區/視窗進入/離開
自動指令,只有在它們真正進入時才會執行。
您可以使用
'statusline' 選項來變更狀態列的內容。此選項可以是視窗的本機選項,因此您可以在每個視窗中具有不同的狀態列。
通常,反相會用來顯示狀態列。可以使用
hl-StatusLine 反白群組來變更此設定。如果狀態列未使用反白顯示,則目前的視窗會使用 '^' 字元,其他視窗則使用 '=' 字元。如果啟用
'mouse',則可以拖曳狀態列來調整視窗大小。
如果給定 [file],則會在新視窗中編輯它。如果它未載入到任何緩衝區中,則會讀取它。否則,新視窗將使用已載入的緩衝區。
注意: CTRL-S
並非在所有終端機上都有效,且可能會封鎖進一步的輸入,請使用
CTRL-Q
再次開始。另請參閱
++opt 和
+cmd。
E242 E1159 在自動指令中分割視窗時請小心,如果當在進行其他視窗配置變更時發生這種情況,可能會搞亂視窗配置。
:[N]new [++opt] [+cmd]
{file}
:[N]sp[lit] [++opt] [+cmd]
{file}
:split_f建立一個新視窗,並在其中開始編輯檔案
{file}
。此行為幾乎像先執行 ":split",然後執行 ":edit" 指令,但原始視窗中的備用檔案名稱會設定為
{file}
。如果給定 [+cmd],則會在檔案載入後執行該指令
+cmd。另請參閱
++opt。使新視窗的高度為 N (預設為現有高度的一半)。縮減目前視窗的高度以騰出空間 (如果設定了
'equalalways' 選項,則也會縮減其他視窗的高度)。
CTRL-W
CTRL-^
CTRL-W_CTRL-^ CTRL-W_^ CTRL-W ^ 將目前視窗分割成兩個,並編輯備用檔案。當給定計數 N 時,分割目前視窗並編輯緩衝區 N。類似於 ":sp #" 和 ":sp #N",但允許另一個緩衝區為未命名。此指令的行為與
CTRL-^ 相同,只是它會先分割視窗。
:hor :horizontal :hor[izontal]
{cmd}
執行
{cmd}
。目前僅對下列指令有影響
:wincmd =
:僅水平均分視窗。
: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" 檔案。
關閉視窗
當設定了
'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' 為
unload
、
delete
或
wipe
)。如果該視窗是目前索引標籤頁中的最後一個視窗,則會關閉該索引標籤頁。
索引標籤頁
對於此命令來說,
「hidden」的值並不重要。緩衝區的變更不會被寫入,也不會遺失,因此這是一個「安全」的命令。
:hid[e]
{cmd}
執行
{cmd}
時,會設定
「hidden」 選項。
{cmd}
執行完畢後,會恢復
「hidden」 的先前值。範例
:hide edit Makefile
這將編輯「Makefile」,並在目前緩衝區有任何變更時隱藏它。
當未設定
「hidden」,且設定了
「autowrite」 選項時,已修改的緩衝區會被寫入。否則,除非給定 [!],否則具有已修改緩衝區的視窗不會被移除,然後它們會變成隱藏狀態。但已修改的緩衝區永遠不會被放棄,因此變更不會遺失。
:fc :fclose :[count]fc[lose][!] 關閉 [count] 個具有最高 zindex 值的浮動視窗。 '!' 關閉所有浮動視窗。
CTRL-W_W CTRL-W W 沒有計數:將游標移動到目前視窗上方/左邊的
可聚焦視窗。如果上方或左邊沒有視窗,則移動到右下角的視窗。有計數:移動到第 N 個視窗,就像使用
CTRL-W
w 一樣。
如果視覺模式處於活動狀態,且新視窗不是用於相同的緩衝區,則視覺模式會結束。如果視窗位於相同的緩衝區上,則游標位置會設定為保持選取相同的視覺區域。
:[count]winc[md]
{arg}
:winc[md] [count]
{arg}
就像執行
CTRL-W
[count]
{arg}
一樣。範例
:wincmd j
移動到目前視窗下方的視窗。當無法使用一般模式時(對於
CursorHold 自動命令事件),此命令很有用。或者當一般模式命令不方便時。計數也可以是視窗編號。範例
:exe nr .. "wincmd w"
這會移動到視窗「nr」。
注意:所有
CTRL-W
命令也可以使用
:wincmd 執行,用於無法使用一般模式命令或不方便使用一般模式命令的地方(例如,在基於瀏覽器的終端機中)。
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
,只是會關閉先前的視窗。當指定計數時,新標籤頁面將在此索引的標籤頁面之前開啟。否則,它會在目前標籤頁面之後開啟。
:{winnr}res[ize] [+-]N 就像上面的 :resize
,但將大小套用至視窗 {winnr}
而不是目前視窗。
z{nr}<CR> 將目前視窗高度設定為 {nr}
。
您也可以使用滑鼠向上或向下拖曳狀態列來調整視窗大小。或者向左或向右拖曳垂直分隔線。這僅在正在使用的 Vim 版本支援滑鼠且
「mouse」 選項已設定為啟用時才起作用。
選項
'winheight' (
'wh') 用於設定目前視窗的最小高度。每次有另一個視窗成為目前視窗時,都會使用這個選項。如果選項值為 '0',則會停用此功能。將
'winheight' 設定為非常大的值,例如 '9999',可使目前視窗始終填滿所有可用空間。將其設定為合理的值,例如 '10',可使在目前視窗中編輯時感到舒適。
當選項
'equalalways' (
'ea') 設定後,分割或關閉視窗後,所有視窗都會自動調整為相同的大小。如果您不設定此選項,分割視窗會縮小目前視窗的大小,而其他視窗保持不變。關閉視窗時,多餘的行會給予上方的視窗。
'eadirection' 選項會限制
'equalalways' 選項的應用方向。預設值 "both" 會在兩個方向調整大小。當值為 "ver" 時,只會將視窗的高度調整為相等。當您手動調整垂直分割視窗的大小並想保持此寬度時,請使用此設定。同樣地,"hor" 只會使視窗的寬度相等。
如果只有一個視窗,調整該視窗的大小也會變更命令列的高度。如果有數個視窗,調整目前視窗的大小也會變更其下方視窗的高度(有時也會變更其上方視窗的高度)。
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()
函數。
執行的命令預期不會導致視窗大小或滾動變更。如果確實發生這種情況,事件將很快再次觸發。換句話說:在觸發事件之前,會儲存目前的大小和滾動位置,並用來判斷是否發生變更。
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。
:sla :slast :sla[st][!] [++opt] [+cmd] 簡寫為 ":split | last": 分割視窗並跳至最後一個引數。但是,如果沒有引數清單,則不會分割視窗。另請參閱
++opt 和
+cmd。
:dr :drop :dr[op] [++opt] [+cmd]
{file}
.. 在視窗中編輯第一個
{file}
。
如果檔案已在視窗中開啟,請變更為該視窗。
如果檔案未在視窗中開啟,請在目前視窗中編輯該檔案。如果無法
放棄目前的緩衝區,則會先分割視窗。
如果可能,會關閉不在引數清單中或不是全寬的視窗。
引數清單會像使用
:next 命令一樣設定。此命令的目的是可以從想要 Vim 編輯另一個檔案的程式(例如偵錯工具)中使用。當使用
:tab 修飾符時,每個引數都會在索引標籤頁面中開啟。如果最後一個視窗為空,則會使用最後一個視窗。另請參閱
++opt 和
+cmd。
:windo :[range]windo
{cmd}
在每個
可聚焦的視窗中執行
{cmd}
,或僅針對給定 [range] 視窗編號中的視窗執行。它的運作方式如下:
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
etc.
此操作僅在目前的索引標籤頁面中執行。如果在一個視窗上偵測到錯誤,則不會存取其他視窗。最後一個視窗(或發生錯誤的位置)會成為目前的視窗。{cmd}
可以包含 '|' 來串連數個命令。{cmd}
不得開啟或關閉視窗或重新排序它們。
:bufdo :[range]bufdo[!]
{cmd}
在緩衝區列表中的每個緩衝區執行
{cmd}
,如果給定 [range],則僅針對緩衝區編號在 [range] 中的緩衝區執行。它的作用類似於執行以下操作:
:bfirst
:{cmd}
:bnext
:{cmd}
etc.
當目前檔案無法
放棄,且沒有 [!] 時,該命令會失敗。當在某個緩衝區中偵測到錯誤時,將不會造訪後續的緩衝區。未列出的緩衝區會被跳過。最後一個緩衝區(或發生錯誤的緩衝區)會成為目前的緩衝區。
{cmd}
可以包含 '|' 來串連多個命令。
{cmd}
不得刪除緩衝區或將緩衝區新增至緩衝區列表。
注意: 當此命令正在執行時,語法自動命令事件會被停用,方法是將其新增至
'eventignore'。這會大幅加快編輯每個緩衝區的速度。
範例
:windo set nolist foldcolumn=0 | normal! zn
這會重設所有視窗中的
'list' 選項並停用摺疊。
:bufdo set fileencoding= | update
這會重設每個緩衝區中的
'fileencoding',並且如果這變更了緩衝區,則會寫入它。結果是所有緩衝區都會使用
'encoding' 編碼(如果轉換成功)。
: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",但如果檔案不存在,則不會建立新的索引標籤頁面。
預覽視窗是用於顯示(預覽)另一個檔案的特殊視窗。它通常是一個小視窗,用於顯示包含檔案或函式的定義。
: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
隱藏的緩衝區不會顯示在視窗中,但仍然會載入到記憶體中。這使得您可以從一個檔案跳轉到另一個檔案,而無需在每次取得視窗中的另一個緩衝區時讀取或寫入檔案。
您可以藉由使用任何命令開始編輯隱藏的緩衝區,或使用 ":bdelete" 命令刪除它,使隱藏的緩衝區不再隱藏。
hidden-quit 當您嘗試在有隱藏的、修改過的緩衝區時退出 Vim,您會收到錯誤訊息,並且 Vim 會將該緩衝區設為目前的緩衝區。然後,您可以決定寫入此緩衝區 (":wq") 或在不寫入的情況下退出 (":q!")。請小心:可能會有更多隱藏的、修改過的緩衝區!
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]
{bufname}
{bufname}從緩衝區列表中編輯
{bufname}
的緩衝區。部分名稱也有效,只要它在緩衝區列表中是唯一的。請注意,名稱為數字的緩衝區不能使用該名稱來參照;請改用緩衝區編號。在緩衝區名稱中的空格前插入反斜線。請參閱
:buffer-! 以了解 [!]。這也會編輯不在緩衝區列表中的緩衝區,而不會設定
'buflisted' 旗標。另請參閱
+cmd。
:[N]sb[uffer] [+cmd]
{bufname}
分割視窗並從緩衝區列表中編輯
{bufname} 的緩衝區。這也會編輯不在緩衝區列表中的緩衝區,而不會設定
'buflisted' 旗標。
注意: 如果您想要做的是分割緩衝區,並以另一個名稱建立副本,則可以使用這種方式
:w foobar | sp #
:[N]bn[ext][!] [+cmd] [N]
:bn :bnext [b E87 前往緩衝區列表中第 [N] 個下一個緩衝區。[N] 預設為 1。會環繞緩衝區列表的末尾。請參閱
:buffer-! 以了解 [!]。另請參閱
+cmd。如果您在說明緩衝區中,這會將您帶到下一個說明緩衝區(如果有的話)。同樣地,如果您在正常的(非說明)緩衝區中,這會將您帶到下一個正常緩衝區。這是為了當您呼叫說明時,它不會在您瀏覽程式碼/文字緩衝區時造成干擾。接下來的三個命令也以這種方式運作。
:[N]bm[odified][!] [+cmd] [N]
:bm :bmodified E84 移動到第 [N] 個下一個已修改的緩衝區。
注意:此命令也會尋找未列出的緩衝區。如果沒有已修改的緩衝區,則命令失敗。
一些有用的緩衝區類型
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