暫存器的型別
Vim的強大功能有很大一部分體現在它豐富的暫存器上。我們可以靈活使用暫存器存取文字,還能將命令錄製於暫存器中。
在Vim中,大部分的修改操作都能夠撤銷,而這也要歸功於背後的暫存器。下面我們來看看Vim這個神器都有哪些神奇的暫存器。
在Vim中,暫存器被分為以下10種型別:
- 未命名暫存器
""
- 10個數字暫存器
"0 ~ "9
- 小型刪除暫存器
"-
- 26個字母暫存器
"a ~ "z
或"A ~ "Z
- 3個只讀暫存器
":
".
"%
- 交替檔案暫存器
"#
- 表示式暫存器
"=
- 選擇拖放暫存器
"*
"+
"~
- 黑洞暫存器
"_
- 搜尋模式串暫存器
"/
這10個暫存器都有自己的特定使用場景,等下面分析完之後,你就能很清楚地知道它們都是幹嘛的了!
暫存器的分析
在正常模式(normal mode)下,我們使用 "reg
來引用某個暫存器。而在其它情況下,我們使用 @reg
來引用某個暫存器。
例如:
#正常模式,使用暫存器a來複制當前行
"ayy
#命令列模式,為暫存器a賦值
:let @a="some text..."複製程式碼
接下來的文章中,我們將使用 "x
的形式來表示 暫存器x
。
OK,下面我們就來分析上述10種暫存器的具體使用場景,以及它們的作用。
1. 未命名暫存器
當我們使用 d, c, s, x
這幾個命令修改文字,或者使用 y
複製文字的時候,無論是否指定了暫存器,這些內容會被儲存到 ""
暫存器中,除非我們指定了黑洞暫存器 "_
。
2. 數字暫存器
當我們進行文字的複製或刪除操作時,內容就會儲存到數字暫存器中。
0號暫存器 "0
儲存最近一次複製的內容,除非指定了其它暫存器。
1號暫存器 "1
儲存最近一次刪除或修改的內容,除非指定了其它暫存器,或內容不到一行(此時將會使用小型刪除暫存器 "-
)。
如果刪除操作與以下移動命令一起使用,那麼將總是使用1號暫存器:%
,(
,)
, `
,/
,?
,n
,N
,{
,}
。此時如果內容不到一行,"-
暫存器會被同時使用。
1號暫存器被再次使用時,原先的內容會轉移到2號暫存器,而2號暫存器的內容則轉移到3號暫存器,以此類推,最後9號暫存器的內容則會被丟棄。
3. 小型刪除暫存器
被刪除的內容不到一行時,該暫存器將被使用。
如果我們指定了其它暫存器,則該暫存器不會被使用。
4. 字母暫存器
只有當我們手動指定了字母暫存器時,它們才會被使用。
當我們使用小寫形式的字母暫存器時,新內容會覆蓋掉之前的內容。
當我們使用大寫形式的字母暫存器時,新內容會追加到之前的內容後面。
如果 cpoptions
選項中含有 >
標誌,則追加內容時會自動新增換行符。
5. 只讀暫存器
只讀暫存器的內容只能被讀取,也就是說,只能使用 p
,P
,:put
或 CTRL-R
命令來獲取它的內容。
".
儲存最後被插入的內容。(與插入模式下使用CTRL-A
和CTRL-@
命令的插入內容一致)"%
儲存當前檔名。":
儲存最後一次在命令列中執行的命令。
6. 交替檔案暫存器
儲存當前視窗中另一個緩衝區檔案的名稱。也就是當我們按下 CTRL-^
時將會跳轉到的那個檔案的名稱。可手動更改它的值,從而讓上述命令跳轉到指定檔案。
let @# = 'buffer_name'複製程式碼
7. 表示式暫存器
表示式暫存器與其它暫存器不同,它並不儲存文字內容,而是用於計算表示式的值。在正常模式下輸入 "=
,或在插入模式下按 CTRL-R=
時,會進入到命令列,在這輸入的命令會經過計算,然後得出結果。
使用表示式暫存器,我們就可以在編輯檔案時方便地讓Vim替我們完成計算(可以是算術計算,也可以是函式呼叫),然後把結果插入到文字中。總之,表示式暫存器可以進一步簡化我們的工作,非常方便!關於表示式的詳細介紹,可以輸入命令 :help expression
檢視。
這裡有兩篇介紹表示式暫存器的文章:
8. 選擇拖放暫存器
這是用於儲存和獲取GUI剪貼簿內容的暫存器。當剪貼簿不可用時,會自動使用未命名暫存器 ""
來代替。
只讀的 "~
暫存器用於儲存拖放到Vim的內容。當有內容拖放到Vim中時,還會觸發虛擬按鍵 <Drop>
,可以通過對映該鍵來完成特定任務。
9. 黑洞暫存器
正如它的名字一樣,寫入該暫存器的內容都會消失。我們可以使用該暫存器來避免其它暫存器受到影響。
讀取該暫存器時,返回的內容為空。
10. 搜尋模式串暫存器
該暫存器儲存了最後一次搜尋的模式串,包括使用 /
以及 :g
、:s
等命令進行匹配的模式串。
手動對該暫存器賦值,也可高亮搜尋結果,與 /
命令的效果一樣。
關於巨集錄製的小技巧
我們在正常模式下錄製巨集的時候,使用的就是上面介紹的暫存器。除了黑洞暫存器和只讀暫存器不能用於錄製巨集以外,其它暫存器都能夠用於錄製巨集。
當我們錄製一串較長的命令時,可能因為某個地方出了錯,導致錄製失敗,需要重新開始。不過,既然錄製的巨集存放於這些暫存器中,那麼我們就能夠像讀取普通文字一樣讀取它們。
例如,我使用暫存器 "a
錄製了一個巨集,但是中間有個地方出了錯。這時我可以使用 "ap
將這串命令貼上下來,然後修改出錯的地方,最後選擇這串命令,通過 "ay
將它們複製回暫存器 "a
。這樣,我們不用重新錄製命令,就完成了巨集的修改,是不是很方便?