1 概述
vim中的複製,刪除,替換(d,r,s,x,y等)的內容都會被保存到默認的未命名的寄存器中,之後可以通過p進行粘貼,但是,這個寄存器不是系統的剪貼版,很多時候需要vim與系統剪貼版的交互,那麼,具體怎麼做呢?
2 暴力解決
系統剪貼版複製vim時,新建一個文件,直接ctrl+v複製過去然後vim打開。
vim中的內容複製到系統剪貼版,使用cat+grep,在終端ctrl+c複製即可。
這是最簡單也是比較通用的方法,不會受到什麼vim不支持剪貼版之類的影響。
沒錯就是簡單粗暴。
3 優雅的方案
當然上面的方法想必也不是您想要的,因此,這裏介紹一種優雅一點的方法。
3.1 查看剪貼板支持
首先需要知道vim是否支持剪貼版:
vim --version | grep clipboard
如果有
+clipboard
就表示支持,沒有的話比如筆者這個就不支持,需要安裝。
筆者的Manjaro,可以使用yay安裝,不過提示過期了:
也可以選擇安裝gvim,另外,Debian系的可以安裝vim-gtk:
sudo apt install vim-gtk
Redhat系的需要安裝vim-X11以及vim-enhanced,然後加個別名:
alias vi='vimx'
alias vim='vimx'
MacOS:
sudo brew install vim
3.2 系統剪貼板複製到vim
很簡單,使用
"+p
或
"*p
即可,vim提供了
+ *
這兩個寄存器與系統剪貼板進行交互,大多數系統上這兩個系統一樣,但在某些linux上可能不等價,以下是官方文檔:
+
對應ctrl+c,ctrl+v使用的系統剪貼板,
*
對應的是鼠標選擇的內容,可以使用中間粘貼。
當然高版本的vim還有一種很簡單的解決辦法:Shift+Insert能直接粘貼。
3.3 vim寄存器複製到系統剪貼板
在vim中使用y進行復制,但是是複製到默認的未命名寄存器的,想要複製到系統剪貼版只需要把y改爲
"+y
或
"*y
即可。
3.4 偷懶方法
所謂的偷懶方法就是把默認的未命名寄存器與系統剪貼板關聯上,使用
set clipboard=unnamed
即可。vim7.3.74以上的版本可以使用:
set clipboard=unnamedplus
這樣y,d,s,x等操作就和系統剪貼版關聯上了。
4 寄存器相關知識
vim中的y,d,c,x,s等的操作的內容會複製到寄存器中,可以使用
:reg
查看寄存器的內容,使用
:help registers
查看幫助,另外,寄存器的常用操作包括:
"{register}y 複製到寄存器,默認register爲未命名寄存器
"{register}p 粘貼寄存器的內容
比如
"a4yy
"+p
vim中提供了多種多樣的寄存器,具體來說可以分爲10種共48個寄存器。
4.1 未命名寄存器
""
也叫匿名寄存器,使用d,c,x等刪除的字符會存放進匿名寄存器,換句話說,最近一次刪除,修改,複製的內容都存放在這裏,會覆蓋。
4.2 編號寄存器
"0
"1
...
"9
從0到9共10個,可以細分爲複製專用寄存器與刪除專用寄存器,因爲
"0
保存着最近一次y複製的內容,而
"1
...
"9
這9個寄存器保存着最近一次刪除(d,c,s,x等)的內容。上一次刪除的內容被存放在
"1
上上次的被存放在
"2
以此類推。
注意,只有整行的刪除,和通過段落級別的移動指令的刪除纔會放進
"1
另外當指定寄存器後,比如
"ayy
不會寫入到
"0
中,但是
"add
會寫入到
"1
中,也就是說,指定寄存器後複製內容不會寫入0寄存器,但是刪除內容會寫入1寄存器。
4.3 小刪除寄存器
"-
不足一行的小刪除會被放進去,包括s,d,c,x。與
"0
類似,用戶指定寄存器後不會被寫入。
4.4 命名寄存器
"a
"b
...
小寫字母組成的26個寄存器,一般用來錄製鍵盤宏,比如有如下內容:
iostream
string
cmath
可以把位置定位到第一行,然後
qaI#include<{ESC}A>{ESC}jq
其中
{ESC}
表示按下ESC鍵,這樣第一行就加上include了,同時把宏記錄到了寄存器a,接下來,使用
2@a
即可在剩餘兩行加上include。
另外,小寫對應的大寫字母的寄存器用於追加內容,比如:
"Ayy
可以向
"a
追加內容。
4.5 只讀寄存器
". 上一次insert插入的內容
"% 當前文件名,從vim的工作目錄到該文件的路徑
": 上次命令模式下鍵入的命令,使用@:執行上次命令, .只能進行一些簡單的重複,一些複雜的命令比如替換,需要使用@:
共三個,只讀。
4.6 交替文件寄存器
"#
保存着當前窗口的交替文件。
交替文件是緩衝區(Buffer)上的一個文件,而緩衝區其實時vim中打開文件編輯時佔用的那部分內存,編輯文件時,只是編輯緩衝區中的文件,當使用
:w
時,會把緩衝區的文件寫入磁盤。
4.7 表達式寄存器
"=
計算vim腳本的返回值,輸入後會跳轉到命令行,此時若輸入3+2,回車並p,會粘貼5。
4.8 選擇拖放寄存器
上面已經介紹了兩個:
"+
"*
還有一個是
"~
其中
"+
"*
在Mac與Windows上指的是系統剪貼板,在大多數X11,也就是帶桌面環境的Linux發行版中是有區別的,上面也提到了一點:
"+ 系統剪貼板
"* 鼠標選中區域,可以中鍵粘貼
有文本拖拽到vim時,被存放在
"~
中,默認會將其中的內容插入到光標位置。
4.9 黑洞寄存器
"_
所有進入到裏面的內容會消失,通常用於腳本中。
4.10 搜索寄存器
"/
存儲上一次搜索的關鍵詞。可寫,通過
:let @/ = "123"
下一次搜索可直接
/
不輸入關鍵詞回車即可。
注意不存在
"?
寄存器。