Vim 緩衝區篇
分類
說明
緩衝區是記憶體中的文件內容,視窗就是用來顯示緩衝區的內容,本篇將分享有關於緩衝區的使用方式。
什麼是緩衝區
緩衝區是一塊記憶體區域,裡面儲存著正在編輯的檔案。如果沒有把緩衝區裡的檔案存檔,那麼原始檔案就不會被更改。
緩衝區旗標
當使用 :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。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!