普段ターミナルで作業する際、 GNU screenを使っていくつかのウィンドウを開いて作業していて、 Vimもそれぞれで開いたりしています。
この際に、別々のVimプロセス間でもクリップボードを共有したいときがあります。
これまで自分で.vimrcに設定を書いてやっていましたが、 Yankround.vim をちょっといじって使うととても便利になったのでそれについて。
以前までの設定
以下の様な設定を.vimrcの中に書いていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
基本的にまずsを押した後にコピーや削除の作業を行うと それを~/.vim/yankshare.txtに書き出し、 spとすると他のVimのプロセスでも貼り付けられる、というもの。
これ自体をプラグイン化しようかとも思いましたが、 この設定ではヤンクの履歴がとれません。
Yankround.vim
一方で普通のヤンク作業ではYankround.vimという プラグインを使って前にヤンクしたものとかも呼び出せる様にしていました。
YankRing.vimというもっと古くからあるプラグインもありますが、 YankroundはYankRingが作る副作用を減らしより使いやすくしたものになっています。
このYankroundもヤンクしたものをファイルに保存しておき呼び出すので、 原理的には他のVimプロセスでも使えるはずです。
ただ、ヤンク時の操作にちょっと足りない点があって思い通りに動かなかったので そのへんを直してみました。
TextYankPostイベントの追加
Yankroundではもともと
CursorMoved
というイベントでYankround_append()
という
ヤンクしたものをファイルに保存する関数を呼んでいました。
ただ、これだとyyとかした直後はまだファイルがアップデートされておらず、 他のVimプロセスで呼び出そうと思っても呼び出せません。
そこでTextYankPost
というイベントでも呼ぶようにしました。
Yankround_append at TextYankPost by rcmdnk · Pull Request #27 · LeafCage/yankround.vim
このTextYankPost
というのは
比較的最近Vim 8.0のPatch 1394で入ったものです。
まさにYankroundなどのためのイベントです。
ただしそのまま入れると古いVimでエラーを出すので、
if exists('##TextYankPost')
autocmd TextYankPost * call Yankround_append()
endif
みたいな感じで導入。
これによりヤンクした瞬間にファイルがアップデートされる様になりました。
これで、あるVimプロセスでyyした直後に他の Vimプロセスでpを一回押した後Ctrl-nを押せば 前のプロセスでヤンクしたものが出てきます。
もともと作っていたYankshareに比べるとペースト時に最初にsを押すか、 後からYankround機能的にCtrl-nで候補を回すかの違いがありますが、 ヤンクのリストを統一的に管理できる様になるので良いんじゃないかな、と。
Pull Requestを出してみましたが、更新が古いプラグインで反応がまだ無いですが、 rcmdnk/yankround.vim に変更したものがあります。
Deinとかであれば、
call dein#add('rcmdnk/yankround.vim')
で導入できます。
まとめ
YankshareはYankshareで別物のクリップボードになるのでこれはこれで 特別に取っておきたいものとかに使えるとは思います。 レジスターとかを使えば良い、という点もあるかもしれませんが余り上手く使いこなせてないので ちょっと整理してみる必要はあるかもしれません。
いずれにしろYankroundのアップデートで統一してクリップボードを共有して 履歴管理できる様になり結構便利になりました。