Vim 視窗篇
分類
說明
在編輯器中,除了開啟多個編輯器可以一次編輯多個文件之外,使用視窗分割,也能在同一個編輯器中,同時編輯多個文件,本篇將分享如何在 Vim 分割視窗。
什麼是視窗
視窗用來查看緩衝區裡的內容。你可以用多個視窗觀察同一個緩衝區,也可以用多個視窗觀察不同的緩衝區。
打開視窗
CTRL-W s
CTRL-W S
CTRL-W CTRL-S
:[N]sp[lit] [++opt] [+cmd] [file]
把目前視窗水平分割成兩個,結果是兩個視窗顯示同一個文件。
新開啟的視窗高度為 N
(預設值是目前視窗高度的一半)。減少目前視窗的高度,空出地方給新的視窗。
如果給予 [file]
,在新視窗中編輯該文件。如果還未在任何緩衝區中載入,先讀入該文件。否則新視窗會使用已載入的緩衝區。
範例
:split
把目前視窗水平分割成兩個,結果是兩個視窗顯示同一個文件。
:split file
把目前視窗水平分割成兩個,並編輯 file。
:sp #N
把目前視窗水平分割成兩個,編輯第 [N]
緩衝區。
CTRL-W CTRL-V
CTRL-W v
:[N]vsp[lit] [++opt] [+cmd] [file]
與 :split
類似但垂直分割視窗。滿足以下條件的話,視窗會均勻地水平鋪開:
- 沒有指定寬度,
- 打開了
equalalways
選項, eadirection
不是ver
,且- 其它視窗中的一個,寬於目前或新視窗。
N
給予時,盡量使新視窗 N
列寬。
範例
:vsplit
把目前視窗垂直分割成兩個,結果是兩個視窗顯示同一個文件。
CTRL-W n
CTRL-W CTRL-N
:[N]new [++opt] [+cmd]
建立一個新視窗並且開始編輯一個空文件。新視窗的高度為 N
(預設值為現存高度的一半)。
這跟先執行 :split
,再執行一個 :enew
指令的效果類別同。
範例
:new
把目前視窗水平分割成兩個,並且開始編輯一個空文件。
:[N]new [++opt] [+cmd] {file}
:[N]sp[lit] [++opt] [+cmd] {file}
查看幫助: :help :split_f
建立一個新的視窗並且開始編輯文件 {file}
。這跟先執行 :split
,再執行一個 :edit
命令的效果大致相同,但原先視窗裡的輪換文件名被設為 {file}
。
新視窗的高度為 N
(預設值為現存高度的一半)。減少目前視窗的高度,為新視窗留出空間。
:[N]vne[w] [++opt] [+cmd] [file]
與 :new
指令相似,但是它垂直分割視窗。
:[N]sv[iew] [++opt] [+cmd] [file]
與 :split
指令相同,但是會給緩衝區置位 readonly
選項,也就是唯讀狀態。
需注意 file 為必填。
範例
:sview file
水平分割視窗,以唯讀方式打開 file。
:[N]sf[ind] [++opt] [+cmd] {file}
與 :split
指令相同,但是會在 path
裡尋找 {file}
,就像 :find
那樣。找不到時不會分割視窗。
需注意 file 為必填。
範例
:sfind file
水平分割視窗,以唯讀方式打開 file,找不到時不會分割視窗。
CTRL-W ^
CTRL-W CTRL-^
把目前視窗分成兩個,並且編輯輪換文件。如果指定了計數,分割視窗,並且編輯第 N
個緩衝區。類似 :sp #
和 :sp #N
,但支援另一緩衝區為無名緩衝區。 此命令匹配 CTRL-^
的行為,但先分割視窗。
:vert[ical] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將垂直分割視窗。
:lefta[bove] {cmd}
:abo[veleft] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將從當前視窗的左 (垂直分割) 或上方 (水平分割) 分割視窗,而忽略 splitbelow
和 splitright
的設定。
:rightb[elow] {cmd}
:bel[owright] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將從目前視窗的右 (垂直分割) 或下方 (水平分割) 分割視窗,而忽略 splitbelow
和 splitright
的設定。
:to[pleft] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼該視窗出現在頂部,並且佔據最大寬度。當垂直分割視窗時,視窗出現在最左邊,並且佔據最大高度。
:bo[tright] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼該視窗出現在底部,並且佔據最大寬度。當垂直分割視窗時,視窗出現在最右邊,並且佔據最大高度。
上列打開視窗修飾符可以結合使用來打開一個垂直分割的並且佔據最大高度的視窗:
:vertical topleft split tags
在 Vim 視窗最左邊打開一個垂直分割的、最大高度的視窗,用來編輯 tags 文件。
關閉視窗
:q[uit]
:{count}q[uit]
CTRL-W q
CTRL-W CTRL-Q
沒有 {count}
: 退出目前視窗。如果給予 {count}
,退出第 {count}
個視窗。
如果退出的是最後一個編輯視窗 (不包括幫助或預覽視窗),就會退出 Vim。
範例
:1quit
退出第一個視窗。
:$quit
退出最後一個視窗。
:9quit
如果開啟少於9個視窗,退出最後一個視窗。
:-quit
退出上一個視窗。
:+quit
退出下一個視窗。
:+2quit
退出下面第二個視窗。
:clo[se][!]
:{count}clo[se][!]
CTRL-W c
沒有 {count}
: 退出目前視窗。如果給予 {count}
,退出第 {count}
個視窗。
如果目前標籤頁只有一個編輯視窗,而且有其它標籤頁,關閉目前標籤頁。
對緩衝區的改動既不寫入文件,也不會遺失,所以這是個 “安全” 的命令。
該命令在下述情況下會失敗:
- 螢幕上只剩下最後一個視窗的時候。
- 當
hidden
沒有置位,也沒有用[!]
,並且緩衝區也已經被修改,而且也沒有其它視窗監視該緩衝區的時候。
:hid[e]
:{count}hid[e]
沒有 {count}
: 除非是螢幕上的最後一個視窗,退出目前視窗。
如果給予 {count}
: 退出第 {count}
個視窗。
如果這是目前標籤頁的最後一個視窗,關閉此標籤頁。
:hid[e] {cmd}
同 :hide
並執行 {cmd}
,其間置位 hidden
選項。{cmd}
執行完畢後,先前的 hidden
選項會被恢復。
範例
:hide edit Makefile
退出目前視窗,如果目前緩衝區有改動的話,隱藏之。接著再编辑 “Makefile” 文件。
:on[ly][!]
:{count}on[ly][!]
CTRL-W o
CTRL-W CTRL-O
使目前視窗成為螢幕上唯一的視窗。其它視窗都關閉。
關於 {count}
,可見 :{count}q[uit]
之上的範例命令。
如果置位了 hidden
選項,則被關閉視窗裡的所有緩衝區變成隱藏。
如果沒有置位 hidden
,但是置位了 autowrite
選項,那麼已經更改的緩衝區被寫入文件。否則,除非使用 [!]
強制關閉,那些包含修改過的緩衝區的視窗不被刪除,它們轉入隱藏狀態。因為修改過的緩衝區永遠不會被放棄,緩衝區的改動也永遠不會丟失。
把遊標移動到另一個視窗
CTRL-W b
CTRL-W CTRL-B
把遊標移動到右下角的視窗。
CTRL-W <Left>
CTRL-W CTRL-H
CTRL-W <BS>
CTRL-W h
把遊標向左移動 N
個視窗。
CTRL-W <Down>
CTRL-W CTRL-J
CTRL-W j
把遊標向下移動 N
個視窗。
CTRL-W <Up>
CTRL-W CTRL-K
CTRL-W k
把遊標向上移動 N
個視窗。
CTRL-W <Right>
CTRL-W CTRL-L
CTRL-W l
把遊標向右移動 N
個視窗。
CTRL-W p
CTRL-W CTRL-P
移到前一個 (previous) (上次訪問的) 視窗。
CTRL-W t
CTRL-W CTRL-T
把遊標移動到左上角的視窗。
CTRL-W w
CTRL-W CTRL-W
如果沒有添加計數,則將遊標移至目前視窗的右/下方的視窗。如果右/下方沒有視窗,就移動到左上角的視窗。
要是添加了計數,就移動到第 N
個視窗(從左上方到右下方依序計數)。視窗號碼可以透過 bufwinnr()
和 winnr()
來獲得。如果 N
大於視窗總數,跳到最後一個視窗。
CTRL-W W
如果沒有添加計數,則將遊標移至目前視窗的左/上方的視窗。如果左/上方沒有視窗,就移動到右下角的視窗。
要是添加了計數,就移動到第 N 個視窗,類似於 CTRL-W w
。
移動視窗
CTRL-W r
CTRL-W CTRL-R
向右/下方向旋轉視窗。第一個視窗變成第二個,第二個變成第三個,以此類推。最後一個變成第一個。遊標保留在相同視窗裡。本操作只在和目前視窗同列或同行的視窗間移動。
CTRL-W R
向左/上方向旋轉視窗。第二個視窗變成第一個,第三個變成第二個,以此類推。第一個變成最後一個。遊標保留在相同視窗裡。本操作只在和目前視窗同行或同列的視窗間移動。
CTRL-W x
CTRL-W CTRL-X
若沒有計數: 交換目前視窗與下一個視窗。如果沒有下一個視窗,則與前一個視窗交換。
若有計數: 交換目前視窗與第 N
個視窗 (第一個視窗為 1)。遊標被放置在那個視窗裡。
如果既有垂直分割又有水平分割,那麼只能與目前視窗同行或同列的視窗進行交換。
移動視窗並改變視窗的佈局
CTRL-W K
把目前視窗放到最頂端,並且是最大寬度。這很像在關閉目前視窗之後,再用 :topleft split
開啟新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W J
把目前視窗放到最底部,並且是最大寬度。這很像在關閉目前視窗之後,再用 :botright split
開啟一個新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W H
把目前視窗放到最左邊,並且是最大高度。這很像在關閉目前視窗之後,再用 :vert topleft split
開啟新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W L
把目前視窗放到最右邊,並且是最大高度。這很像在關閉目前視窗之後,再用 :vert botright split
打開一個新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W T
把目前視窗移到一個新的標籤頁。如果當前標籤頁只有一個視窗,此命令失敗。
如果給予計數,開啟的新標籤頁會出現在該索引給出的標籤頁之前。否則,它出現在當前標籤頁之後。
改變視窗大小
CTRL-W =
使得所有視窗 (幾乎) 等寬、等高,但目前視窗使用 winheight
和 winwidth
。
:res[ize] -N
[N]CTRL-W -
使得目前視窗高度減 N
(預設值是 1)。
:res[ize] +N
[N]CTRL-W +
使得目前視窗高度加 N
(預設值是 1)。
:res[ize] [N]
CTRL-W CTRL-_
CTRL-W _
設定目前視窗的高度為 N
(預設值為最大可能高度)。
z{nr}<CR>
設定目前視窗的高度為 {nr}
。
[N]CTRL-W <
使得目前視窗寬度減 N
(預設值是 1)。
[N]CTRL-W >
使得目前視窗寬度加 N
(預設值是 1)。
:vert[ical] res[ize] [N]
[N]CTRL-W |
設定目前視窗的寬度為 N
(預設值為最大可能寬度)。
你也可以用滑鼠上下拖曳狀態行來改變視窗的高度,或是左右拖曳垂直分割線來改變視窗寬度。這些功能只有在支援滑鼠的版本裡,並且設定了 mouse
選項才可以使用。
參數列表和多視窗
:[N]sn[ext][!] [++opt] [+cmd] [file ..]
這是 :split | [N]next
命令的簡寫。分割視窗並切換到向後第 N
個參數。但是如果該參數不存在,視窗不會分割。
[file ..]
為定義新的參數列表。
:[N]spr[evious][!] [++opt] [+cmd] [N]
:[N]sN[ext][!] [++opt] [+cmd] [N]
這是 :split | [N]Next
命令的簡寫。分割視窗並切換到向前第 N
個參數。但是如果該參數不存在,視窗不會分割。
在所有的緩衝區或視窗裡執行命令
:[range]windo {cmd}
在每個視窗執行 {cmd}
,如果給出 [range]
,只對視窗號在 [range]
內的視窗執行。這就像是:
CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
等等 ......
- 只在目前標籤頁進行操作。如果在一個視窗裡偵測到錯誤,餘下的視窗不再存取。最後一個視窗 (或出錯的那個視窗) 成為目前視窗。
{cmd}
可以包含|
來連接多個命令。{cmd}
不能打開或關閉視窗,也不能更換它們的順序。
範例
:windo %s/Foo/Bar/g
將每個視窗所有內容為 Foo 都改成 Bar。
當前遊標處的標籤和文件名
:sta[g][!] [tagname]
執行 :tag[!] [tagname]
並且分割視窗給找到的標籤。
範例
:stag foo
分割視窗並移動到 foo 標籤位置。
[N]CTRL-W ]
[N]CTRL-W CTRL-]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗跳到標籤所指向的地方。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
[N]CTRL-W g ]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗執行 :tselect
。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
[N]CTRL-W g CTRL-]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗執行 :tjump
。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
[N]CTRL-W f
[N]CTRL-W CTRL-F
把目前視窗一分為二。 編輯遊標下的文件名。
如果指定了計數 N
,那麼編輯第 N
個匹配的文件。
CTRL-W F
把目前視窗一分為二。編輯遊標下的文件名稱並跳到文件名稱之後的行號上。
行號範例
eval.c:10
輸入 :help gF
查看行號詳細說明。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!