[轉]vim如何復制到系統剪貼板


今天學習vim時,想用vim把編輯器內部的內容粘貼到系統剪貼板,隨后就發現這個有趣的內容,以下轉載至知乎網友

作者:胖君
鏈接:https://www.zhihu.com/question/19863631/answer/442180294
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

根據平台不同,要分兩種情況。先用下面命令確定你屬於哪一種,

vim --version | grep clipboard

 情況一,

如果結果里你找到加號開頭的+clipboard, 恭喜你,你的vim沒問題,是你姿勢問題。

  • "+y 代替y將選中的內容復制到系統剪貼板,效果和ctrl-c一致。
  • "+p代替p將剪貼板內容復制到指定位置,也可以用ctrl-v

dxcs也一樣,用之前前面加"+

如果想偷懶用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能不能復制粘貼。可以的話就說明是混用的,不行就老老實實用"+

 

以上。遇到此坑的同學了解一下。

作者:whinc
鏈接:https://www.zhihu.com/question/19863631/answer/89354508
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

Vim 中的復制、刪除的內容都會被存放到默認(未命名)寄存器中,之后可以通過粘貼操作讀取默認寄存器中的內容。寄存器是完成這一過程的中轉站,Vim 支持的寄存器非常多,其中常用的有 a-zA-Z0-9+“。其中:

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

如果想了解更多寄存器內容,可參


通過下面命令可以查看所有寄存器中的內容,也可以只查看指定寄存器的內容(將寄存器名稱作為參數)

:reg [register_name] 

有了上面的基礎知識后,要實現題主"將 Vim 剪貼板里面的東西粘貼到 Vim 之外的地方?"就很明了,只需要將內容復制到剪切板寄存器(+)中即可,其他程序便可以訪問到了。


"+yy  // 復制當前行到剪切板
"+p   // 將剪切板內容粘貼到光標后面
"ayy  // 復制當前行到寄存器 a
"ap   // 將寄存器 a 中的內容粘貼到光標后面

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM