Vim 緩衝區篇


建立時間: 2024年2月20日 08:57
更新時間: 2024年11月6日 08:48

說明

緩衝區是記憶體中的文件內容,視窗就是用來顯示緩衝區的內容,本篇將分享有關於緩衝區的使用方式。

什麼是緩衝區

緩衝區是一塊記憶體區域,裡面儲存著正在編輯的檔案。如果沒有把緩衝區裡的檔案存檔,那麼原始檔案就不會被更改。

緩衝區旗標

當使用 :ls 顯示緩衝區:

1 #h "/test/text" line 1

其中第二行為狀態旗標,旗標說明如下。

在表格中同一行上的符號不可能同時出現,使用 “_” 區分不同行。

識別符號 說明
u 列表外緩衝區 (只有使用 ! 才能看到)
_% 目前視窗裡的緩衝區
_# :e #CTRL-^ 可切換的輪換緩衝區
__a 啟動緩衝區: 已載入記憶體並且可見
__h 隱藏緩衝區: 已載入記憶體但是沒有視窗顯示它
___- 不可更改的緩衝區,選項 modifiable 被關閉
___= 唯讀緩衝區
____+ 已經更改的緩衝區
____x 有讀取錯誤的緩衝區

使用隱藏緩衝區

隱藏的緩衝區不會在視窗裡顯示,但仍然載入記憶體,這使得 Vim 可以在文件間切換,而無需每次在一個視窗裡讀入另一個緩衝區時讀寫文件。


:files[!] [flags]
:buffers[!] [flags]
:ls[!] [flags]

顯示所有緩衝區。

如果使用了 [!],將顯示所有的緩衝區,包括列表外緩衝區(unlisted)。


:[N]bd[elete][!]
:bd[elete][!] [N]

卸載緩衝區 [N] (預設: 目前緩衝區) 並且從緩衝區列表裡刪除該緩衝區。如果緩衝區被改動過,那麼該命令將會失敗,除非使用 [!],但這樣所有的改動都會丟失,檔案不受影響。該緩衝區的所有視窗都會關閉。如果緩衝區 [N] 是目前的緩衝區,那麼 Vim 會顯示另一個緩衝區來代替。


:[N]b[uffer][!] [+cmd] [N]

編輯緩衝區列表中第 [N] 個緩衝區,如果沒指定 [N],就編輯目前的緩衝區。這個命令同樣可以編輯不在列表裡的緩衝區,buflisted 不會因而被置位。

[!] 強制切換離開未儲存的緩衝區。

可以把這個指令當作移動到指定編號的緩衝區。

範例

:buffer 1
移動到編號1的緩衝區。


ex 命令

:[N]bN[ext][!] [+cmd] [N]
:[N]bp[revious][!] [+cmd] [N]

至緩衝區列表往前第 [N] 個緩衝區。[N] 預設是 1。如果到了緩衝區列表的頂端,則從末尾往前循環。

範例

:bNext
:bprevious
前往上一個緩衝區。


:bad[d] [+lnum] {fname}

如果 {fname} 尚未列出,在緩衝區列表中新增檔案名稱 {fname},但不把該檔案載入記憶體。如果該緩衝區之前被刪除但不是真正刪除,它會被重新列出。

如果指定了 lnum,那麼第一次進入緩衝區時,遊標會停留在那一行。注意 其它 + 後面的命令將被忽略。

範例

:badd +10 ~/.vimrc
將 ~/.vimrc 加入緩衝區列表,並指定打開時,游標停留在第10行。


:[N]ba[ll] [N]
:[N]sba[ll] [N]

重新排列螢幕,並為緩衝區列表中的每一個緩衝區開啟一個視窗。如果給出計數,則計數為開啟視窗的最多數目。

如果使用 :tab 修飾符,新視窗在新標籤頁上打開,直到用完 tabpagemax 個標籤頁為止。


:bf[irst] [+cmd]

:brewind 相同。

範例

:bfirst
前往第一個緩衝區。


:bl[ast][!] [+cmd]

至緩衝區列表中的最後一個緩衝區。如果列表為空,則轉到最後一個列表外緩衝區。

範例

:blast
前往最後一個緩衝區。


:[N]bm[odified][!] [+cmd] [N]

至往後第 [N] 個修改過的緩衝區。

備註: 這項命令同樣也能找到列表外緩衝區。如果沒有修改的緩衝區,此命令失敗。

範例

:bmodified
前往下一個修改過的緩衝區。


:[N]bn[ext][!] [+cmd] [N]

至緩衝區列表裡往後第 [N] 個緩衝區。[N] 預設是 1。如果到了緩衝區列表的末尾,則從頭循環。

範例

:bnext
前往下一個緩衝區。


:br[ewind][!] [+cmd]

至緩衝區列表中的第一個緩衝區。如果列表為空,則轉到第一個列表外緩衝區。

範例

:brewind
前往第一個緩衝區。


:[range]bufdo[!] {cmd}

在緩衝區列表的每一個緩衝區執行 {cmd},如果給出 [range],只對緩衝區號在 [range] 內的緩衝區執行。就像是:

:bfirst
:{cmd}
:bnext
:{cmd}
等等 ......

  • 如果目前檔案不能被丟棄 abandon,且沒有使用 [!],命令失敗。
  • 當在一個緩衝區裡偵測到錯誤,剩下的緩衝區不再存取。
  • 跳過列表外緩衝區。
  • 最後一個緩衝區 (或出錯的那個緩衝區) 成為目前緩衝區。
  • {cmd} 可以包含 | 來連接多個指令。
  • {cmd} 不能刪除或新增緩衝區到緩衝區列表。

範例

:bufdo set fileformat=unix
將緩衝區的檔案變更為 Unix 格式。


:[N]bun[load][!]
:bun[load][!] [N]

卸載緩衝區 [N] (預設: 目前緩衝區)。原來佔用的記憶體將被釋放。該緩衝區還保留在緩衝區列表裡。

如果緩衝區被改動過,那麼該命令將失敗,除非使用 [!],但是這樣所有的改動都會丟失。

該緩衝區的所有視窗都會關閉。如果緩衝區 [N] 是當前的緩衝區,那麼 Vim 會顯示另一個緩衝區來代替。具體來說,Vim 會選擇跳轉表裡最新且已經載入的緩衝區。

範例

:bunload 4
卸載緩衝區列表編號4的緩衝區。


:e[dit] [++opt] [+cmd] #[count]

編輯第 [count] 個緩衝區 (根據 :files 顯示的結果)。

這個命令和 [count] CTRL-^ 一樣,但是 :e # 在輪換緩衝區沒有檔案名稱時不能工作,而 CTRL-^ 則可以。


:[N]sbN[ext] [+cmd] [N]
:[N]sbp[revious] [+cmd] [N]

分割視窗並至緩衝區列表往前第 [N] 個緩衝區。如果到了緩衝區列表的頂端,則從末尾往前循環。

範例

:sbNext
:sbprevious
分割視窗並前往上一個緩衝區。


:sbf[irst] [+cmd]

:sbrewind 相同。

範例

:sbfirst
分割視窗並前往第一個緩衝區。


:sbl[ast] [+cmd]

分割視窗並至緩衝區列表中的最後一個緩衝區。如果列表為空,則轉到最後一個列表外緩衝區。

範例

:sblast
分割視窗並前往最後一個緩衝區。


:[N]sbm[odified] [+cmd] [N]

分割視窗並至往後第 [N] 個修改過的緩衝區。

備註: 這個命令也能找到不在列表裡的緩衝區。

範例

:sbmodified
分割視窗並前往下一個修改過的緩衝區。


:[N]sbn[ext] [+cmd] [N]

分割視窗並至緩衝區列表往後第 [N] 個緩衝區。如果到了緩衝區列表的末尾,則從頭循環。

範例

:sbnext
分割視窗並前往下一個緩衝區。


:sbr[ewind] [+cmd]

分割視窗並至緩衝區列表中的第一個緩衝區。如果列表為空,則轉到第一個列表外緩衝區。

範例

:sbrewind
分割視窗並前往第一個緩衝區。


:[N]sb[uffer] [+cmd] [N]

分割視窗並編輯緩衝區列表中第 [N] 個緩衝區,如果沒指定 [N],就編輯目前的緩衝區。這個指令同樣可以編輯不在列表裡的緩衝區,buflisted 不會因而被置位。

範例

:sbuffer 1
分割視窗並編輯編號1的緩衝區。


:[N]sun[hide] [N]
:[N]unh[ide] [N]

重新排列螢幕,為緩衝區列表中的每一個載入的緩衝區開啟一個視窗。如果給出計數,則計數為開啟視窗的最多數目。


:[range]windo {cmd}

在每個視窗執行 {cmd},如果給出 [range],只對視窗號在 [range] 內的視窗執行。這就像是:

CTRL-W t
:{cmd}
CTRL-W w
:{cmd}
等等 ......

  • 只在目前標籤頁進行操作。如果在一個視窗裡偵測到錯誤,餘下的視窗不再存取。最後一個視窗 (或出錯的那個視窗) 成為目前視窗。
  • {cmd} 可以包含 | 來連接多個命令。
  • {cmd} 不能打開或關閉視窗,也不能更換它們的順序。

範例

:windo %s/Foo/Bar/g
將每個視窗所有內容為 Foo 都改成 Bar。

觀看次數: 730
buffervim緩衝區
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

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

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