標籤:
原來在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
VIM中的寄存器簡介