Vim 視窗篇
分類
說明
在編輯器中,除了開啟多個編輯器可以一次編輯多個檔案之外,使用視窗分割,也能在同一個編輯器中,同時編輯多個檔案,本篇將分享如何在 Vim 分割視窗。
什麼是視窗
視窗用來查看緩衝區裡的內容。你可以用多個視窗觀察同一個緩衝區,也可以用多個視窗觀察不同的緩衝區。
普通命令
下面開始為普通命令。
分割視窗
[N]CTRL-W ]
[N]CTRL-W CTRL-]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗跳到標籤所指向的地方。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
[N]CTRL-W ^
[N]CTRL-W CTRL-^
把目前視窗分成兩個,並且編輯輪換檔案。如果指定了計數,分割視窗,並且編輯第 N
個緩衝區。類似 :sp #
和 :sp #N
,但支援另一緩衝區為無名緩衝區。 此命令匹配 CTRL-^
的行為,但先分割視窗。
CTRL-W F
把目前視窗一分為二。編輯遊標下的檔案名稱並跳到檔案名稱之後的行號上。
行號範例
eval.c:10
輸入 :help gF
查看行號詳細說明。
[N]CTRL-W f
[N]CTRL-W CTRL-F
把目前視窗一分為二。 編輯遊標下的檔名。
如果指定了計數 N
,那麼編輯第 N
個匹配的檔案。
[N]CTRL-W g ]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗執行 :tselect
。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
[N]CTRL-W g CTRL-]
把目前視窗一分為二,把遊標所在的識別碼當作標籤,並在上面的新視窗執行 :tjump
。
可視模式下把可視選擇的文字當作標籤。
新視窗的高度為 N
。
CTRL-W n
CTRL-W CTRL-N
建立一個新視窗並且開始編輯一個空文件。新視窗的高度為 N (預設值為現存高度的一半)。
CTRL-W s
CTRL-W S
CTRL-W CTRL-S
把目前視窗水平分割成兩個,結果是兩個視窗顯示同一個檔案。
CTRL-W v
CTRL-W CTRL-V
把目前視窗垂直分割成兩個,結果是兩個視窗顯示同一個檔案。
把遊標移動到另一個視窗
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 H
把目前視窗放到最左邊,並且是最大高度。這很像在關閉目前視窗之後,再用 :vert topleft split
開啟新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W J
把目前視窗放到最底部,並且是最大寬度。這很像在關閉目前視窗之後,再用 :botright split
開啟一個新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W K
把目前視窗放到最頂端,並且是最大寬度。這很像在關閉目前視窗之後,再用 :topleft split
開啟新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W L
把目前視窗放到最右邊,並且是最大高度。這很像在關閉目前視窗之後,再用 :vert botright split
打開一個新的視窗,不過新視窗會包含目前視窗的內容。
CTRL-W T
把目前視窗移到一個新的標籤頁。如果當前標籤頁只有一個視窗,此命令失敗。
如果給予計數,開啟的新標籤頁會出現在該索引給出的標籤頁之前。否則,它出現在當前標籤頁之後。
改變視窗大小
CTRL-W =
使得所有視窗 (幾乎) 等寬、等高,但目前視窗使用 winheight
和 winwidth
。
[N]CTRL-W -
使得目前視窗高度減 N
,預設值是1。
[N]CTRL-W +
使得目前視窗高度加 N
,預設值是1。
[N]CTRL-W CTRL-_
[N]CTRL-W _
設定目前視窗的高度為 N
(預設值為最大可能高度)。
[N]CTRL-W <
使得目前視窗寬度減 N
(預設值是 1)。
[N]CTRL-W >
使得目前視窗寬度加 N
(預設值是 1)。
[N]CTRL-W |
設定目前視窗的寬度為 N
(預設值為最大可能寬度)。
z{nr}<CR>
設定目前視窗的高度為 {nr}
。
關閉視窗
CTRL-W c
退出目前視窗。
如果目前標籤頁只有一個編輯視窗,而且有其它標籤頁,關閉目前標籤頁。
對緩衝區的改動既不寫入檔案,也不會遺失,所以這是個 “安全” 的命令。
該命令在下述情況下會失敗:
- 螢幕上只剩下最後一個視窗的時候。
- 當
hidden
沒有置位,並且緩衝區也已經被修改,而且也沒有其它視窗監視該緩衝區的時候。
CTRL-W o
CTRL-W CTRL-O
使目前視窗成為螢幕上唯一的視窗。其它視窗都關閉。
如果置位了 hidden
選項,則被關閉視窗裡的所有緩衝區變成隱藏。
如果沒有置位 hidden
,但是置位了 autowrite
選項,那麼已經更改的緩衝區被寫入檔案。
CTRL-W q
CTRL-W CTRL-Q
退出目前視窗。
如果退出的是最後一個編輯視窗 (不包括幫助或預覽視窗),就會退出 Vim。
gvim 操作
分享 gvim 一些不錯的操作。
改變視窗大小
分割視窗後,你可以使用滑鼠調整大小。水平分割時,點選並上下拖曳視窗邊界調整大小;而垂直分割則呈現一條垂直虛線,點擊虛線即可左右調整大小。
ex 命令
關閉視窗
:clo[se][!]
:{count}clo[se][!]
沒有 {count}
: 退出目前視窗。
如果給予 {count}
,退出第 {count}
個視窗。
功能同 CTRL-W c
。
該命令在下述情況下會失敗:
- 當
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
。
關於 {count}
,可見 :{count}q[uit]
之上的範例命令。
如果沒有置位 autowrite
選項,而使用 [!]
強制關閉,那些包含修改過的緩衝區的視窗不被刪除,它們會轉入隱藏狀態。
:q[uit]
退出目前視窗。
如果退出的是最後一個編輯視窗 (不包括幫助或預覽視窗),就會退出 Vim。
:q[uit]!
退出不保存,即使當前緩衝區發生了修改也是。
:{count}q[uit]
退出第 {count}
個視窗。
如果 {count}
大於最後一個視窗號,關閉最後一個視窗。
範例
:1quit
退出第一個視窗。
:$quit
退出最後一個視窗。
:9quit
如果開啟少於9個視窗,退出最後一個視窗。
:-quit
退出上一個視窗。
:+quit
退出下一個視窗。
:+2quit
退出下面第二個視窗。
分割視窗前綴
這裡的前綴主要用來搭配分割指令,範例如下。
:vertical topleft split tags
在 Vim 視窗最左邊打開一個垂直分割的、最大高度的視窗,用來編輯 tags 文件。
:bo[tright] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼該視窗出現在底部,並且佔據最大寬度。當垂直分割視窗時,視窗出現在最右邊,並且佔據最大高度。
:lefta[bove] {cmd}
:abo[veleft] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將從當前視窗的左 (垂直分割) 或上方 (水平分割) 分割視窗,而忽略 splitbelow
和 splitright
的設定。
:rightb[elow] {cmd}
:bel[owright] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將從目前視窗的右 (垂直分割) 或下方 (水平分割) 分割視窗,而忽略 splitbelow
和 splitright
的設定。
:to[pleft] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼該視窗出現在頂部,並且佔據最大寬度。當垂直分割視窗時,視窗出現在最左邊,並且佔據最大高度。
:vert[ical] {cmd}
執行 {cmd}
。如果包含一個分割視窗的命令,那麼將垂直分割視窗。
分割相關命令
:[N]new [++opt] [+cmd]
建立一個新視窗並且開始編輯一個空文件。新視窗的高度為 N
(預設值為現存高度的一半)。
這跟先執行 :split
,再執行一個 :enew
指令的效果類別同。
範例
:new
把目前視窗水平分割成兩個,並且開始編輯一個空文件。
:[N]sf[ind] [++opt] [+cmd] {file}
與 :split
指令相同,但是會在 path
裡尋找 {file}
,就像 :find
那樣。找不到時不會分割視窗。
需注意 file 為必填。
範例
:sfind file
水平分割視窗,以唯讀方式打開 file,找不到時不會分割視窗。
:[N]sp[lit] [++opt] [+cmd] [file]
把目前視窗水平分割成兩個,結果是兩個視窗顯示同一個檔案。新開啟的視窗高度為 N
(預設值是目前視窗高度的一半)。
範例
:split
把目前視窗水平分割成兩個,結果是兩個視窗顯示同一個檔案。
:split file
把目前視窗水平分割成兩個,並編輯 file。
:sp #N
把目前視窗水平分割成兩個,編輯第 [N]
緩衝區。
:sta[g][!] [tagname]
執行 :tag[!] [tagname]
並且分割視窗給找到的標籤。
範例
:stag foo
分割視窗並移動到 foo 標籤位置。
:[N]sv[iew] [++opt] [+cmd] [file]
與 :split
指令相同,但是會給緩衝區置位 readonly
選項,也就是唯讀狀態。
需注意 file 為必填。
範例
:sview file
水平分割視窗,以唯讀方式打開 file。
:[N]vne[w] [++opt] [+cmd] [file]
與 :new
指令相似,但是它垂直分割視窗。
:[N]vsp[lit] [++opt] [+cmd] [file]
與 :split
類似但垂直分割視窗。滿足以下條件的話,視窗會均勻地水平鋪開:
- 沒有指定寬度,
- 打開了
equalalways
選項, eadirection
不是ver
,且- 其它視窗中的一個,寬於目前或新視窗。
N
給予時,盡量使新視窗 N
列寬。
範例
:vsplit
把目前視窗垂直分割成兩個,結果是兩個視窗顯示同一個檔案。
改變視窗大小
:res[ize] -N
使得目前視窗高度減 N
(預設值是 1)。
:res[ize] +N
使得目前視窗高度加 N
(預設值是 1)。
:res[ize] [N]
設定目前視窗的高度為 N
(預設值為最大可能高度)。
:vert[ical] res[ize] [N]
設定目前視窗的寬度為 N
(預設值為最大可能寬度)。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!