原來在vim粘貼從其他地方復制過來的文本的時候,一直用的shift + inert,那時就想,能不能夠直接就像p那樣粘貼,不必非得進入插入模式再來粘貼。后來看了《vim實用技巧》上關于vim寄存器的介紹,發現這里面大有文章,所以今天特意拿來和大家分享。
首先對vim中的寄存器來進行個大致瀏覽,它主要分為這么幾個部分:
1.無名寄存器(" )
2.復制專用寄存器 (0)
3.系統剪貼板(X11視窗系統下的主剪貼板)(*)
4.黑洞寄存器 (_)
5.命名寄存器 (a-z)
6.表達式寄存器 (=)
7.其他的一些只讀寄存器("/寄存器特殊)
在詳細了解這些寄存器之前,我們還得了解幾個和寄存器有關的命令:
0.各種復制粘貼命令說明
本文中提到的d命令,y命令,c命令指的是和這個操作符相關聯的命令集合,比如和y操作符相關聯的一些命令如下:
1 yy //復制當前行2 yw //當前光標下面的這個單詞3 yit //復制一個html標簽中的內容4 yft //復制當前行上光標到第一個t之間的所有內容5 6 。。。
1.在普通模式中使用寄存器
在執行粘貼(p)命令,或者復制(y)和剪切(x,s,d,c和他們的大寫)命令時,可以在前面加上 "{register}(其中那個{register}代表的是寄存器的名字),這樣我們就可以使用相應的寄存器了,如果不加的話,默認使用的是無名寄存器。
比如,%代表的是文件名寄存器,存放的是當前正在編輯的文件名,我現在打開了一個文件file2,并且正處于普通模式,如下圖所示:
此時如果我輸入以下內容:
1 "%p2 3 //表示將文件名寄存器的內容粘貼到當前行
文件內容就變成這個樣子了:
2.在插入模式中使用寄存器
在插入模式,當我們按下<CTRL> + R鍵,再加上相應的寄存器的名字,就可以插入寄存器中的內容了。
比如=代表的是表達式寄存器,比如我在vim中輸入如下命令:
1 i #進入插入模式2 <C-r>= #按下<Ctrl>+r鍵,再按等號鍵,此時就可以輸入表達式了
此時vim的頁面如下圖所示:
然后,此時光標跳到了vim最底下的任務條(具體這個地方我也不知道叫啥,就是ex模式輸入命令的那個地方),在這里就可以輸入vim腳本命令了,比如,我輸入一個2+3。那么運算的結果5自動就會添加到主窗口,光標也會回到主窗口,如下圖所示:
3.查看當前寄存器的內容
在ex模式下輸入reg或者dis命令,就可以查看當前所有寄存器的內容了。運行的結果如下圖所示:
Ok,了解了這幾個常用的關于寄存器的命令之后,我們再來了解一下vim中的各種寄存器。
首先是無名寄存器,它用一個雙引號(")來標識,這個是我們接觸的最多的寄存器了,如果沒有特別指定的話,復制(y),剪切(x,s,d,c和他們的大寫),粘貼(p)命令都會將內容存放到這個寄存器里面,或是從這個寄存器里面來讀取內容。
第二個是復制專用寄存器,就是使用y命令復制的內容都會存放到這個寄存器中,比如這么一段文本:
1 PRintf("Hello, ");2 printf("world!/n");
我先把光標停留在第一行上,按下yy命令,將第一行復制,然后再移到第二行,按下dd命令,刪除第二行。此時如果我們想要粘貼第一行的內容的話,直接按p是不行的,因為此時的p將引用無名寄存器中的內容,而它的內容已經被第二行的內容給覆蓋了,所以此時就輪到復制專用寄存器大顯身手了,此時如果按下這個命令:
1 "0p
這時,將會粘貼復制專用寄存器中的內容。這里直接貼結果圖可能看不出什么效果,那我就貼一下用dd刪除了第二行后所有寄存器的內容給大家看看吧:
從這里可以看出,無名寄存器保存的是dd命令刪除的內容,而復制專用寄存器(0)保存的是y命令復制的內容。
第三個是系統剪貼板寄存器(+)和X11視窗系統的主剪貼板寄存器(*)。個人認為這個比較常用,所以就先說了。眾所周知,任何操作系統都有一個剪貼版板,而vim就是用+寄存器來代表這個剪貼版,我經常遇到的情況就是在瀏覽器中復制了一段文本,然后需要在vim中粘貼,感覺這時候這個+寄存器就大顯身手了。比如在逛博客的時候看到別人的代碼,如下所示:
1 def main():2 print "Python is Fun"3 4 main()
直接復制就都復制到系統剪貼板了,這時打開vim想要粘貼到vim中,那么只需要這個命令就好了
“+p
這樣就把系統剪貼板中的內容直接貼進vim的緩沖區了,結果如下圖所示(這個是Windows下面的gvim,所以沒有主剪貼板這個寄存器,+和*表示的是一個寄存器):
需要聲明的一點是這個剪貼板需要vim在編譯的時候加上clipboard這個選項,想要查看自己的vim有沒有這個選項,只要打開vim,在ex模式下輸入version命令,就可以查看自己的vim支不支持這個特性了,如下圖所示:
還有一個主剪貼板的寄存器,這個是在linux下的X11視窗系統中才存在的東西,這個寄存器中存放的就是上次高亮選中的內容。這個由于我Linux上面自帶的vim編譯的時候沒有添加clipboard選項,所以就不演示了。
第四個要說明的就是黑洞寄存器,顧名思義,這個寄存器的功能和/dev/null設備非常地相似,就是將一切輸入其中的東西都吞噬掉^ o ^。平常我們經常用x命令來刪除某個字符,用dd命令來刪除某行,其實這些都不是刪除,是剪貼,真正的刪除應該是這些命令:
1 "_dd //刪除某行2 "_x //刪除光標下的字符
第五個要說明的就是命名寄存器了,這個一共是a-z26個寄存器,分別用英文字母來表示。這個感覺主要需要講的就是大寫字母和小寫字母的區別,當向寄存器中寫入內容的時候(即復制或者剪切的時候),大寫字母表示的是將當前要復制的內容追加到寄存器中,而小寫字母表示的是將當前要復制的內容將寄存器中的原有內容給覆蓋掉。這個可以類比于數據流重定向中的">"和">>"命令。
舉個例子,比如現在有個文件file2,其中的內容是這樣
1 printf("Hello, ");2 printf("World!/n");
而a寄存器中的內容剛開始是這樣:
我在第一行上執行了 "Ayy命令之后,a寄存器中的內容就變成了這樣,第一行的內容被追加到了寄存器中:
接著我再在第二行上執行 "ayy命令之后,a寄存器中的內容就變成了這樣,寄存器中原來的內容都被覆蓋掉了:
第六個要說的就是表達式寄存器,這個在前面已經舉過例子了,可以在normal模式下按"=或者插入模式下按<C-r>,=來進入編輯vim表達式的模式,表達式運行的結果將被插入到vim的緩沖區中。這個我一般用來做運算,比如這樣:
第七個要說的就是一些存放特定信息的寄存器了,主要是下面這幾個:
7.1 當前文件名寄存器 (%)
7.2 輪換文件名寄存器 (#)
7.3 上次執行的ex命令 (:)
7.4 上次查找的關鍵字 (/)
這個舉例子的話就是下面這個,我打開了兩個文件file1和file2,然后切換到了file2,并進行了一次查找,查找了hello關鍵字,執行了兩次reg命令,第二次reg命令執行結果如下圖:
最后四行分別就是對應我們上面講的那四個寄存器,這里需要注意的的是關鍵字寄存器(/)比較特殊,它是可以通過let命令來更改的,具體的執行命令如下:
let @/="the"
上面這條命令就是讓查找的關鍵字變成了the。
OK,這個就是全部內容了,如果大家想對vim中的寄存器中的內容有進一步的了解,可以參考《vim實用技巧》第10章,或者查看vim中關于寄存器的幫助文檔。
:help registers
新聞熱點
疑難解答