Vim 視窗篇


建立時間: 2023年5月15日 05:35
更新時間: 2024年4月3日 08:36

說明

在編輯器中,除了開啟多個編輯器可以一次編輯多個檔案之外,使用視窗分割,也能在同一個編輯器中,同時編輯多個檔案,本篇將分享如何在 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 =

使得所有視窗 (幾乎) 等寬、等高,但目前視窗使用 winheightwinwidth


[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}。如果包含一個分割視窗的命令,那麼將從當前視窗的左 (垂直分割) 或上方 (水平分割) 分割視窗,而忽略 splitbelowsplitright 的設定。


:rightb[elow] {cmd}
:bel[owright] {cmd}

執行 {cmd}。如果包含一個分割視窗的命令,那麼將從目前視窗的右 (垂直分割) 或下方 (水平分割) 分割視窗,而忽略 splitbelowsplitright 的設定。


: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 類似但垂直分割視窗。滿足以下條件的話,視窗會均勻地水平鋪開:

  1. 沒有指定寬度,
  2. 打開了 equalalways 選項,
  3. eadirection 不是 ver,且
  4. 其它視窗中的一個,寬於目前或新視窗。

N 給予時,盡量使新視窗 N 列寬。

範例

:vsplit
把目前視窗垂直分割成兩個,結果是兩個視窗顯示同一個檔案。

改變視窗大小

:res[ize] -N

使得目前視窗高度減 N (預設值是 1)。


:res[ize] +N

使得目前視窗高度加 N (預設值是 1)。


:res[ize] [N]

設定目前視窗的高度為 N (預設值為最大可能高度)。


:vert[ical] res[ize] [N]

設定目前視窗的寬度為 N (預設值為最大可能寬度)。

觀看次數: 974
vimwindowwindows視窗

相關文章:

按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!