Vim で clipborad 連携(Ubuntu 16.04)
Vim でヤンクした結果を他のアプリケーションでペーストできるようにします。
途中で詰まって色々調べたのでメモ代わりです。
環境
必要な設定
Vim で clipboard の機能が使えている必要があります。
vim --version |grep clipboard
-clipboard
となっていれば clipboard の機能が無効になっています。
自分は apt
で入れていた Vim で clipboard が使えなかったのでそちらは削除して vim-gtk
を代わりにいれました。
この設定が有効になっていればビジュアルモードで "+y
でヤンクした結果を cntl+v
でペーストできます。
毎回 "+
とかを打つのはめんどくさいので .vimrc
に set clipboard=unnamedplus
を書いておいてあげると y
でヤンクするだけで結果を cntl+v
でペーストできるようになります。
補足
Vim で clipboard 連携する系の記事を検索すると set clipbaord=unnamed
を設定するように書いてある記事が多いのですが、Ubuntu では動かないようです。
X Window System を採用している OS ではコピーしたものを格納する領域として PRIMARY
と CLIPBOARD
があります(SECONDARY
という領域もありますがあまり使われないようです)
Vim にも *
レジスタと +
レジスタがあって *
は PRIMARY
領域と +
は CLIPBOARD
を対応しています。
PRIMARY
→*
CLIPBOARD
→+
ctrl+c
, ctrl+v
は CLIPBOARD
領域を利用しているため +
レジスタにヤンクの結果が格納される必要があります。
+
レジスタに保存するためには unnamed
ではなく unnamedplus
が設定されていなければなりません。
注意点
自分はこれだけではうまく動かずはまってしまいました。
ヤンクした結果を terminal に貼ることができなかったので clipboard に入っていないものだと思っていたのですが、 どうやら vim で編集しているファイルを閉じたりバックグランドでの実行に移すタイミングでレジスタがクリアされていたようです。
参考:Prevent Vim from clearing the clipboard on exit - Stack Overflow
自分は解決策としては上の記事にあるように .vimrc
に以下の設定をいれました。
autocmd VimLeave * call system("xsel -ib", getreg('+'))
autocmd VimLeave
は vim 終了直前に発火するイベントです(autocmd - Vim日本語ドキュメント)
getreg('+')
で +レジスタ
の内容を読みだして CLIPBOARD 領域に書き込んでいます。