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