vim與系統剪貼版的交互

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"

下一次搜索可直接

/

不輸入關鍵詞回車即可。
注意不存在

"?

寄存器。

5 參考

1.Vim 寄存器完全手冊

2.Vim官方文檔-1

3.Vim官方文檔-2

4.知乎-如何將 Vim 剪貼板裏面的東西粘貼到 Vim 之外的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章