vim複製到剪切板

做者:whinc
連接:https://www.zhihu.com/question/19863631/answer/89354508
來源:知乎
轉載文章

Vim 中的複製、刪除的內容都會被存放到默認(未命名)寄存器中,以後能夠經過粘貼操做讀取默認寄存器中的內容。寄存器是完成這一過程的中轉站,Vim 支持的寄存器很是多,其中經常使用的有 a-zA-Z0-9+「。其中:html

  • 0-9:表示數字寄存器,是 Vim 用來保存最近複製、刪除等操做的內容,其中 0 號寄存器保存的是最近一次的操做內容。
  • a-zA-Z:表示用戶寄存器,Vim 不會讀寫這部分寄存器
  • "(單個雙引號):未命名的寄存器,是 Vim 的默認寄存器,例如刪除、複製等操做的內容都會被保存到這裏。
  • +:剪切板寄存器,關聯繫統剪切板,保存在這個寄存器中的內容能夠被系統其餘程序訪問,也能夠經過這個寄存器訪問其餘程序保存到剪切板中的內容。

若是想了解更多寄存器內容,可參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

dxcs也同樣,用以前前面加"+get

若是想偷懶用y直接把內容複製到系統剪貼板,須要到vim配置文件.vimrc里加一行屬性。用下面命令開始配置,

vim ~/.vimrc

而後,加入下面這行,

set clipboard=unnamed

如今你的ydxp已經能和 ctrl-cctrl-v 一個效果,而且能互相混用。

 

狀況二,

若是找到的是負號開頭的-clipboard說明你的vim不支持系統剪切板,個人MacOS系統自帶vim就不支持,因此跑來了。須要先從新安裝vim,

Linux系統,

sudo apt install vim-gtk

MacOS,

brew install vim

安裝好以後,重複狀況一的操做便可。

 

 

問題解決了,有幾個細節再解釋一下,知足一下好奇心。

首先,vim裏ydxc複製,剪切下來的內容臨時存放在一個叫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-cctrl-v用到的系統剪貼板:desktop clipboard (XA_SECONDARY)
  • "*:對應圖形界面中鼠標框選的內容(能夠用鼠標中鍵黏貼):X11 primary selection (XA_PRIMARY)

因此看到"*也不要慌,試試看用"*y"*p能不能複製粘貼。能夠的話就說明是混用的,不行就老老實實用"+

 

以上。遇到此坑的同窗瞭解一下。

 

參考文獻:

相關文章
相關標籤/搜索