今天學習vim時,想用vim把編輯器內部的內容粘貼到系統剪貼板,隨后就發現這個有趣的內容,以下轉載至知乎網友
鏈接:https://www.zhihu.com/question/19863631/answer/442180294
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
根據平台不同,要分兩種情況。先用下面命令確定你屬於哪一種,
vim --version | grep clipboard
情況一,
如果結果里你找到加號開頭的+clipboard
, 恭喜你,你的vim沒問題,是你姿勢問題。
- 用
"+y
代替y
將選中的內容復制到系統剪貼板,效果和ctrl-c
一致。 - 用
"+p
代替p
將剪貼板內容復制到指定位置,也可以用ctrl-v
。
d
,x
,c
,s
也一樣,用之前前面加"+
。
如果想偷懶用y
直接把內容復制到系統剪貼板,需要到vim配置文件.vimrc
里加一行屬性。用下面命令開始配置,
vim ~/.vimrc
然后,加入下面這行,
set clipboard=unnamed
現在你的y
,d
,x
,p
已經能和 ctrl-c
和ctrl-v
一個效果,並且能互相混用。
情況二,
如果找到的是負號開頭的-clipboard
,說明你的vim不支持系統剪切板,我的MacOS系統自帶vim就不支持,所以跑來了。需要先重新安裝vim,
Linux系統,
sudo apt install vim-gtk
MacOS,
brew install vim
安裝好之后,重復情況一的操作即可。
問題解決了,有幾個細節再解釋一下,滿足一下好奇心。
首先,vim里y
,d
,x
,c
復制,剪切下來的內容臨時存放在一個叫vim寄存器(Register)的地方。而且寄存器有好幾個。下面vim命令可以看到寄存器列表,
:reg
最常用的默認寄存器""
叫 未命名寄存器(unnamed register)。最近一次刪除,修改,復制內容統統暫存這里(會覆蓋,只保留最近一次任意操作)。感興趣的同學可以看下表,其他寄存器都是干什么的。
"" // 默認unnamed寄存器,最近一次"d","c","s","x","y"復制,刪除,修改內容
"0 // 最近一次"y"復制內容
"1 // 最近一次"d","c","s","x"刪除,修改內容
"2 // 上一次"d","c","s","x"刪除,修改內容
"3 // 上上次"d","c","s","x"刪除,修改內容
...
"9 // [1-9]數字以此類推
"a // 字母寄存器,供用戶指定使用,比如"ay就是復制到"a寄存器
"b
...
"z
"- // 少於一行的"d","c","x"刪除內容
". // 只讀寄存器
": // 只讀寄存器
"% // 只讀寄存器
"# // 只讀寄存器
"+ // 映射系統剪貼板 (有的默認設置不支持)
"* // 映射系統剪貼板 (有的默認設置不支持)
而ctrl-c
以及ctrl-v
用到的是系統剪貼板(system clipboard)。vim寄存器和系統剪貼板不是一個東西。顧名思義,vim寄存器的數據作用域僅限於vim本地,甚至如果開多個vim窗口,每個窗口都有一套自己完整的寄存器,互相不影響。而系統剪貼板作為系統級別的全局變量,兩邊當然不能混用。
所以vim專門提供了"+
寄存器作為對系統剪貼板的映射。可以理解成自動把"+
寄存器的內容再復制一份到系統剪貼板,前提是你得把clipboard
屬性設置成打開。有些版本(比如MacOS自帶的vim)就不支持這個映射。重裝vim就是為了打開這個開關。(如果有簡便的直接改設置方法,請糾正我)。打開以后用"+y
命令把內容復制到和系統剪貼板關聯的寄存器"+
上。而y
只是復制到默認無名寄存器""
上。
最后set clipboard=unnamed
就是把默認無名寄存器""
和系統剪貼板也關聯上。 就是用y
也可以備份到系統剪貼板。缺點是破壞了默認寄存器""
的本地性。因為p
操作也會被等同於"+p
處理,粘貼的是"+
寄存器的內容, 粘貼的時候""
默認寄存器內容就會被覆蓋。 表現出來的就是復制一次,到任意vim窗口都可以粘貼。但這個特性恰恰是很多人想要的。
還有個細節,大部分系統上"+
和"*
是等價的。但在有的系統上不等價,比如Linux,
"+
:對應ctrl-c
和ctrl-v
用到的系統剪貼板:desktop clipboard (XA_SECONDARY
)"*
:對應圖形界面中鼠標框選的內容(可以用鼠標中鍵黏貼):X11 primary selection (XA_PRIMARY
)
所以看到"*
也不要慌,試試看用"*y
和"*p
能不能復制粘貼。可以的話就說明是混用的,不行就老老實實用"+
。
以上。遇到此坑的同學了解一下。
鏈接:https://www.zhihu.com/question/19863631/answer/89354508
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
Vim 中的復制、刪除的內容都會被存放到默認(未命名)寄存器中,之后可以通過粘貼操作讀取默認寄存器中的內容。寄存器是完成這一過程的中轉站,Vim 支持的寄存器非常多,其中常用的有 a-zA-Z0-9+“。其中:
- 0-9:表示數字寄存器,是 Vim 用來保存最近復制、刪除等操作的內容,其中 0 號寄存器保存的是最近一次的操作內容。
- a-zA-Z:表示用戶寄存器,Vim 不會讀寫這部分寄存器
- "(單個雙引號):未命名的寄存器,是 Vim 的默認寄存器,例如刪除、復制等操作的內容都會被保存到這里。
- +:剪切板寄存器,關聯系統剪切板,保存在這個寄存器中的內容可以被系統其他程序訪問,也可以通過這個寄存器訪問其他程序保存到剪切板中的內容。
如果想了解更多寄存器內容,可參http://vimdoc.sourceforge.net/htmldoc/change.html#registers
通過下面命令可以查看所有寄存器中的內容,也可以只查看指定寄存器的內容(將寄存器名稱作為參數)
:reg [register_name]
有了上面的基礎知識后,要實現題主"將 Vim 剪貼板里面的東西粘貼到 Vim 之外的地方?"就很明了,只需要將內容復制到剪切板寄存器(+)中即可,其他程序便可以訪問到了。
"+yy // 復制當前行到剪切板
"+p // 將剪切板內容粘貼到光標后面
"ayy // 復制當前行到寄存器 a
"ap // 將寄存器 a 中的內容粘貼到光標后面