VIM使用系列:寄存器與復制粘貼緩沖區
現在已經可以熟練使用VIM的大多數基本命令、功能來進行項目代碼的開發了,但是在項目的開發過程中,依然會感覺到一些操作效率比較低,比如通過h/j/k/l來進行光標的大范圍移動這類操作,顯然VIM提供了更高效的命令操作方式。最近經常需要完成的工作就是需要在代碼之間來回的復制、粘貼、搜索和替換,常用的d/y/x/p命令已經顯得不夠,於是學習了一下VIM的寄存器功能,使用寄存器的內容緩沖功能可以極大地提高大量復制粘貼工作的效率。
寄存器類型
VIM中有9中類型的寄存器,寄存器的主要功能就是緩存操作過程中刪除、復制、搜索等的文本內容,通過 :help registers命令查看寄存器的詳細幫助說明,這裡對類型翻譯如下:
未命名寄存器 "" —— vim使用的默認寄存器,文本來源命令:d/c/s/x/y
10個數字命名寄存器 "0 - "9 —— vim緩存yank和delete行操作命令產生的文本
1個非行刪除內容緩存寄存器 "- —— vim緩存delete操作在非行上時產生的文本
26個字母命名寄存器 "a - "z / "A - "Z —— 完全由用戶指定內容的寄存器
4個只讀寄存器 ". "% "# ":
表達式寄存器 "= —— 使用VIM強大的表達式功能(從來沒用過,一點不懂)
GUI選擇寄存器 "* "+ "~ —— vim緩存在GUI中選擇的文本
黑洞寄存器 "_ —— 類似Linux中的/dev/null文件,只進不出,可用來濾掉影響默認寄存器的內容
最後搜索模式寄存器 "/ —— 緩存在vim中使用過的最後的搜索內容
這些寄存器很多,那怎麼來查看它們的內容呢?使用VIM的 :registers命令或者短一些的 :dis命令,這兩個命令會列出所有存在的寄存器的內容,然後你就可以選擇指定寄存器的內容進行粘貼了。
寄存器使用
注意到上述寄存器的命名前面都有一個雙引號,這就是使用他們的方式。
在Normal模式下操作d/y/x等命令時,通過在命令前面加入寄存器的名字如 "ayy,來將命令生成的內容放入指定的寄存器中,如上面的a寄存器中,而不是vim默認使用的""寄存器和"0寄存器。
粘貼時,通過在p命令的前面加入寄存器的名字如 "ap,來將寄存器中的內容放入到光標所在的位置行上或下。
只讀寄存器、搜索模式寄存器由VIM進行內容放入,用戶只能使用他們的內容。
下面對個人覺得在開發中會比較有用和熟悉的一些寄存器進行具體的說明。
數字寄存器
"0 : 存放最近使用最多的y命令生成的文本內容,如果未顯式指定其內容
"1 - "9 : 存放最近使用的d行操作命令生成的文本內容,如果未顯式指定其內容,並在9個寄存器間對內容進行輪流存放,即有新的內容時,將"1的內容推到"2, 2到3,3到4 ...
字母寄存器
如果你打算將一段內容進行多次長時間的來回拷貝,則最好使用字母寄存器,因為他們的內容被你修改後不會被VIM自動修改掉,而數字寄存器的內容隨著新操作的使用會覆蓋掉你指定的內容。
"a - "z : 每次指定這些寄存器之一時,產生的文本內容將覆蓋掉寄存器中原有的內容
"A - "Z : 每次指定這些寄存器之一時,產生的文本內容將追加到寄存器中原有的內容之後,如果選項'cpoptions'的值中有>符號,則在追加同時會進行行分割,可以通過命令: :set cpo+=>設置。
只讀寄存器
". : 包含最後在vim insert模式下插入的文本內容,也可以通過命令 . 重復上一次的操作。
"% : 包含當前文件的名字,方便在文件中插入文件名
"# : 包含當前可選擇的文件名,指在當前會話中使用過的文件的名字
系統剪貼板
在系統中進行多個應用之間的內容拷貝時,會使用到系統剪貼板,這可以使用"*,"+寄存器來將內容粘貼到VIM中,他們也都是只讀寄存器。除此之外,還可以使用鍵盤快捷鍵Shift+Insert來快速插入。
寄存器內容設置
除了上面介紹的通過在操作命令前添加寄存器號來指定寄存器的內容外,vim還提供了在命令行顯式指定寄存器內容的命令 :let-@,例如命令 :let @a = "vim registers blog", 表示將"a寄存器內容設置為右值。
粘貼模式
在vim中可以通過命令 :set paste來設置粘貼模式狀態,此時粘貼的內容將可以保持原有的格式不變;通過命令 :set nopaste命令回到正常操作模式。