天天看點

SSH+VIM 共享剪切闆實作詳解共享剪切闆介紹

SSH+VIM 共享剪切闆實作詳解

  • 共享剪切闆介紹
    • 共享剪切闆的實作原理
    • 共享剪切闆的實作配置
    • 本地虛拟機上共享剪切闆的簡化實作

共享剪切闆介紹

Linux和Windows各有優勢, 為了發揮他們各自的功能優勢, 相信很多Linux伺服器和Linux嵌入式開發的小夥伴和我一樣在開發中使用最多方式是通過Windows上的SSH用戶端(Putty/Xshell/ScureCRT/Mobaxterm, etc)通過SSH遠端登陸到一個真實的伺服器或者是一個本地Win10啟動的virtualbox/vmware虛拟機。這種遠端SSH的方式預設情況下有是個缺點就Windows和Linux開發主機的剪切闆是不共享的。當然如果如果在Putty上通過滑鼠選擇+右鍵來粘貼也是能夠實作簡單的剪切闆共享的。不過這種方式對vim就顯得不怎麼好用了,畢竟vim的全鍵盤操作方式和頻繁的使用滑鼠操作是格格不入的,如果我們希望遠端登入的情況下vim的y、p操作也能正常和windows共享剪切闆呢,則需要我們實作真正的剪切闆共享功能。

共享剪切闆的實作原理

想要實作真正的共享剪切,必須有借助大多數Linux發行版中圖形界面提供Xwindow機制,這個Xwindow架構這就不詳解了,希望了解更多的小夥伴可以自行百度一下,簡單的總結一下Xwindow就是Linux下通過它實作了圖形顯示的請求和顯示方法的分離。也就是指伺服器上運作的圖形程式的界面顯示操作可以不局限在本地的顯示器,通過Xwindow可以實作圖形界面在在其他任何一台機器上顯示的效果。Xwindow架構中将Linux本地運作的支援Xwindow的程式稱之為Xclient,負責實作圖形顯示的程式稱之為Xserver,程式的圖形界面想要在另一個機器上顯示的前提條件自然是這個顯示機器上需要有完整的Xserver支援程式(Winodws上比較出名的Xserver實作程式有:Xming、Xmanager以及Mobaxterm)以及本地的Linux系統需要啟動圖形界面(如果你的linux開發主機沒有啟動圖形界面,很不幸,下面的方法都不适用于你)。

Xwindow的這個效果還是挺牛逼的,不過這個功能實際個人感覺沒什麼太多用處了,畢竟通過完整的遠端桌面登陸軟體可以獲得更加完整好用的遠端桌面體驗。不過幸運的是這個Xwindow在實作的時候順便實作了一個系統級剪切闆,我們在Ubuntu、CentOS上通過滑鼠右鍵在圖形界面上選擇複制等操作實際上就将内容複制到Xwindow的這個系統剪切闆上來。由于這個剪切闆是Xwindow實作的,自然就帶了Xwindow最牛逼的遠端特性。是以隻要我們在本地Win10上啟動一個Xserver程式,然後再在Linux開發主機上配置Xwindow使用這個Win10上的Xserver,此後Windows的系統剪切闆就和Linux開發主機上的系統剪切闆連接配接在一起了,不管那邊執行了複制指令,這個共享剪切闆都會自動更新。

除了要知道Xwindow存在這麼一個神奇的系統剪切闆之外,我們還需要了解一下VIM的剪切闆管理機制:

VIM中實際上沒有剪切闆的概念,VIM内部維護了多個緩存寄存器,這些寄存器都可以當成剪切闆來了解。通過:reg指令我們一般可以看多如下内容:

SSH+VIM 共享剪切闆實作詳解共享剪切闆介紹

這裡的每一行都是一個寄存器,其中0-9可以了解為是vim内部維護的10個獨立剪切闆,我們在使用y指令的時候實際上預設就在使用這個0号寄存器,1-9号寄存器實際上就是剪切闆曆史記錄。這裡我們需要重點了解的是*号和+号剪切闆,通過;h registers幫助文檔我們可以了解到這兩個剪切闆在vim編譯時添加+xterm_clipboard特性才會支援,并且如果這兩個剪切闆不存在, 那麼對他的所有操作都會預設重定向到0号剪切闆上來。xterm_clipboard這個特性實際上就是指終端是否支援Xwindow實作的系統剪切,幾乎現在所有Linux發行版的終端都支援這個特性。是以現代的vim一般都可以借助這兩個寄存器來實作vim鍵盤指令來在操作Xwinow剪切闆,其中的星号剪切對應是Xwindow的選擇剪切闆(滑鼠選擇時自動複制内容到這個剪切闆),加号剪切對應的是和Win10上系統剪切闆類似的複制剪切闆(滑鼠選擇并按下複制快捷鍵後才會将選擇的内容複制到這個複制剪切闆),由于Windows上沒有選擇剪切闆的概念,是以Win10上實作的Xserver程式預設都是直接将這兩個剪切闆映射的Windows唯一的系統剪切闆上來。這個特性的結果就是如果配置好了Xwinodw共享剪切闆,vim中操作這個兩個剪切闆任何一個都會觸發Win10剪切闆的更新,相反的,Win10下複制任何内容到系統剪切闆都會觸發vim中這兩個剪切闆的内容同時更新。

共享剪切闆的實作配置

有了上面的基礎概念後,我隻需要做以下幾個配置就可以實作共享剪切闆了:

  1. Win10上選擇一個Xserver程式并且配置好啟動:這裡個人推薦使用Mobaxterm,首先這個軟體是免費綠色免安裝的,第二它自帶Xserver實作隻需要簡單勾選一下随程式啟動就能實作正常的Xserver服務,配置截圖類似如下:
    SSH+VIM 共享剪切闆實作詳解共享剪切闆介紹
    通過如上的配置後隻要Win10上運作着Mobaxterm就會自動提供一個Xserver服務,是不是很友善,畢竟Mobaxterm還有很多其他牛逼的功能嘛,這個Xserver隻是順便啟動了一下(Mobaxterm是可以直接取代Putty實作ssh登陸的,是以實際上Windows端可以隻啟動一個Mobaxterm就能完成所有的遠端登入操作,隻可惜到目前為止最新的Mobaxterm 11.1 在vim設定了set termguicolors配置時依然存在光标消失的問題而導緻我不得不繼續使用Putty實作ssh登陸)。
  2. Linux開發主機上配置Xwindow使用遠端的Xserver來替代本地的Xserver:

    大部分Linux發行版在圖形界面啟動時都是使用startx指令來啟動Xwindow的,預設情況下發行版在圖形啟動時候總是會啟動一個本地Xserver并且自動設定本地的圖形界面使用本地的Xserver(畢竟圖形界面主要的功能還是本地顯示嘛),Xwinow指定Xserver的方式很簡單,使用DISPLAY環境變量即可完成。當DISPALY=:0.0或者DISPLAY=:0時表示的是使用本地的Xserver,在Linux圖形界面本地啟動個終端并使用

    printenv|grep DISPLAY指令你應該能總使能看到該環境變量被預設設定成了:0/:0.0。為了使用Win10遠端

    的Xserer我們隻要需要重新 指定DISPLAY即可。

在你的~/.bashrc中添加如下配置以實作SSH登陸時總是能自動執行DISPLAY的配置:

export DISPLAY=4.25.6.23:0 #其中的ip修改為你自己Win10主機的ip。

  1. 修改vim的y、p指令預設使用共享剪切闆:

    前面已經提到vim中y、p指令預設情況下使用的0号剪切闆,想要使用星号或加号剪切闆闆得通過“*y/"*p來操作,這麼費勁的操作自然是不樂意的,為了更加友善的使用共享剪切闆,我們應該讓配置vim預設使用星号或加号剪切闆。

在你~/.vimrc中加入如下配置即可實作vim預設使用系統級剪切闆:

set clipboard=unnamedplus,unnamed " 為了在多視窗見方面的複制粘貼, 這裡選擇預設使用’+'剪切闆

  1. Win10建議額外使用一個更好的剪切闆曆史管理器:

    最新的Win10實際上已經提供了個剪切闆曆史管理功能,不過鑒于這個剪切闆曆史管理器沒有搜尋功能且管理的曆史記錄也不是太多,是以這裡建議還是找一個更加專業的剪切闆曆史管理器使用的好,個人推薦Ditto這個軟體,可綠化且功能強大,用了之後你一定會感謝我的。

本地虛拟機上共享剪切闆的簡化實作

上面提到的配置方式是通用的一個配置方式,不管是遠端linux主機還是本地的linux虛拟機都是适用的,這個實作方案的一個缺點就是需要在本地的Win10主機上額外啟動一個Xserver程式,像我這種由于Mobaxterm還存在BUG導緻不得不繼續使用Putty的情況,搞個開發還需同時啟動兩個程式,嗯,不是太開心。幸運的是,如果你像我一樣,大部分開發都是Win10本地啟動一個虛拟機然後再用SSH登陸這個虛拟機來幹活的,則有一個更加友善簡化的方法可以實作剪切闆共享。

這個簡化方法的實作首先要了解的是不管virtualbox還是vmware,大部分虛拟機軟體都會提供一個增強工具,這個增強工具一般都會提供如下幾個功能:

  1. 為虛拟機提供圖形性能增強。 2. 提供一個共享目錄功能。 3. 提供一個共享剪切闆功能。

其中的第三點提供的共享剪切闆功能可以了解為虛拟機會自動幫我們完成Win10主機系統剪切闆和Linux虛拟客戶機系統剪切闆之間的同步操作,也就是指這裡虛拟機程式替代了遠端Xserver程式來為我們提供了共享剪切闆能力。是以,如果我們僅僅是想實作個共享剪切闆的功能自然不用在Win10上再啟動個Xserver了。

有了如上的概念了解後,我們隻需要做如下配置就可以完成在不啟動Xserver的情況下實作共享剪切闆的功能了:

  1. 指定SSH登陸本地虛拟機時總是使用本地的Xserver:

    預設情況下的Xwindow有這麼一個特性:給本地圖形界面指派DISPALY=:0(前提到過),給遠端SSH登陸的終端自動指派DISPALY=localhost:10.0, 為什麼會這麼自動配置我也沒怎麼研究,總之這個配肯定是不能幹活的,前面我們通過.bashrc中修改DISPLAY來實作将其配置成正确的遠端主機,這裡由于我們需要繼續使用Linux本地Xserver提供的系統剪切闆,是以我們應該在SSH登陸時将DISPALY變量繼續保持為指向本地Xserver。

  2. 修複sudo vim指令中系統剪切闆無效的問題

    Xwindow預設情況下還有個特性就是如果Xserver指向的是本地Xserver它總是預設不允許其他使用者直接使用Xserever(這個限制在執行遠端Xserver時是沒有的,是以第一個實作方法中沒有提及這個問題),這裡的其他賬戶包括root,也就是說我們在用自己的賬戶登陸到linux系統後不管是通過sudo還是su切換到root賬戶Xserver總是自動被禁用了(驗證這個問題的一個方法是sudo vim啟動vim後通過;reg檢視寄存器,你會發現*和+寄存器消失了)。這就導緻了我們在使用sudo vim編輯一些/etc等系統檔案時無法正常使用系統剪切闆了,這個問題隻要是在DISPLAY=:0時總是預設會有的,嗯,不是很爽。幸運的是,Xwindow提供了一個取消這個限制的指令:xhost + , 在使用sudo之前隻需要執行一次這個指令,就能解除Xwindow對其他使用者的限制。既然是隻用執行一次,而且是普遍需要修複的問題,自然是放在~/.bashrc中自動配置最合适啦。

綜合上面兩點說明,我隻需要在自己的~/.basrhrc中添加如下兩個配置,就能實作本地虛拟機共享剪切闆功能:

export DISPLAY=:0 # 将Xserver重定向到本地

xhost + > /dev/null # 授權其他使用者可以使用本地的Xserver以保證系統剪切闆在sudo操作使也能正常使用

當然,這個簡化的方法隻是避免了額外在Win10上啟動一個Xserver的操作,第一個方法中的3、4步驟配置還是建議保持的。

好了, 通過上面的簡單的配置,現在就已經可以愉快的在vim、sudo vim中使用使用共享剪切闆闆了。

enjoy it!

繼續閱讀