Vim 中的複製、刪除的內容都會被存放到默認(未命名)寄存器中,以後能夠經過粘貼操做讀取默認寄存器中的內容。寄存器是完成這一過程的中轉站,Vim 支持的寄存器很是多,其中經常使用的有 a-zA-Z0-9+「。其中:html
若是想了解更多寄存器內容,可參http://vimdoc.sourceforge.net/htmldoc/change.html#registersvim
經過下面命令能夠查看全部寄存器中的內容,也能夠只查看指定寄存器的內容(將寄存器名稱做爲參數)bash
:reg [register_name]
有了上面的基礎知識後,要實現題主"將 Vim 剪貼板裏面的東西粘貼到 Vim 以外的地方?"就很明瞭,只須要將內容複製到剪切板寄存器(+)中便可,其餘程序即可以訪問到了。spa
"+yy // 複製當前行到剪切板
"+p // 將剪切板內容粘貼到光標後面
"ayy // 複製當前行到寄存器 a
"ap // 將寄存器 a 中的內容粘貼到光標後面
Vim 有12個粘貼板依次編號爲:0、一、二、...、九、a、"、+,其中 + 號爲系統粘貼板,」 爲臨時粘貼板。系統剪切板中的內容可在其餘程序中使用。上面的複製指令均可以配合剪切板進行操做。.net
"nyw 複製當前單詞到 n 號剪切板(雙引號開始)
"np 粘貼 n 號剪切板內容到當前位置後
"+Y 複製當前行到系統剪切板
"+nY 複製當前行往下 n 行到系統剪切板
"+p 粘貼系統剪切板內容到當前位置後code
根據平臺不一樣,要分兩種狀況。先用下面命令肯定你屬於哪種,htm
vim --version | grep clipboard
狀況一,ip
若是結果裏你找到加號開頭的+clipboard
, 恭喜你,你的vim沒問題,是你姿式問題。作用域
"+y
代替y
將選中的內容複製到系統剪貼板,效果和ctrl-c
一致。"+p
代替p
將剪貼板內容複製到指定位置,也能夠用ctrl-v
。d
,x
,c
,s
也同樣,用以前前面加"+
。get
若是想偷懶用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
能不能複製粘貼。能夠的話就說明是混用的,不行就老老實實用"+
。
以上。遇到此坑的同窗瞭解一下。
參考文獻: