rcmdnk's blog

Yank [DVD] [Import]

普段ターミナルで作業する際、 GNU screenを使っていくつかのウィンドウを開いて作業していて、 Vimもそれぞれで開いたりしています。

この際に、別々のVimプロセス間でもクリップボードを共有したいときがあります。

これまで自分で.vimrcに設定を書いてやっていましたが、 Yankround.vim をちょっといじって使うととても便利になったのでそれについて。

以前までの設定

以下の様な設定を.vimrcの中に書いていました。

.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
" yankshare prefix
noremap [yshare] <Nop>
map s [yshare]

let g:yankshare_file = expand('~/.vim/yankshare.txt')
if !exists('g:yankshare_file')
  let g:yankshare_file = '/tmp/yankshare.txt'
endif


function! YSStore() range
  call writefile([getreg('s')], g:yankshare_file, 'b')
endfunction

function! YSLoad() range
  call setreg('s', readfile(g:yankshare_file, 'b')[0])
endfunction

nnoremap <silent> [yshare]y  "syy:call YSStore()<CR>
nnoremap <silent> [yshare]yy "syy:call YSStore()<CR>
nnoremap <silent> [yshare]Y  "sY:call YSStore()<CR>
nnoremap <silent> [yshare]y$ "sy$:call YSStore()<CR>
nnoremap <silent> [yshare]y0 "sy0:call YSStore()<CR>
nnoremap <silent> [yshare]yw "syw:call YSStore()<CR>
nnoremap <silent> [yshare]cc "scc<ESC>:call YSStore()<CR>i
nnoremap <silent> [yshare]C  "sC<ESC>:call YSStore()<CR>i
nnoremap <silent> [yshare]c$ "sc$<ESC>:call YSStore()<CR>i
nnoremap <silent> [yshare]c0 "sc0<ESC>:call YSStore()<CR>i
nnoremap <silent> [yshare]cw "scw<ESC>:call YSStore()<CR>i
nnoremap <silent> [yshare]dd "sdd:call YSStore()<CR>
nnoremap <silent> [yshare]D  "sD:call YSStore()<CR>
nnoremap <silent> [yshare]d$ "sd$:call YSStore()<CR>
nnoremap <silent> [yshare]d0 "sd0:call YSStore()<CR>
nnoremap <silent> [yshare]dw "sdw:call YSStore()<CR>

xnoremap <silent> [yshare]y "sy:call YSStore()<CR>
xnoremap <silent> [yshare]c "sc<ESC>:call YSStore()<CR>i
xnoremap <silent> [yshare]d "sd:call YSStore()<CR>

nnoremap <silent> [yshare]p :call YSLoad()<CR>"sp
nnoremap <silent> [yshare]P :call YSLoad()<CR>"sP
nnoremap <silent> [yshare]gp :call YSLoad()<CR>"sgp
nnoremap <silent> [yshare]gP :call YSLoad()<CR>"sgP

基本的にまずsを押した後にコピーや削除の作業を行うと それを~/.vim/yankshare.txtに書き出し、 spとすると他のVimのプロセスでも貼り付けられる、というもの。

これ自体をプラグイン化しようかとも思いましたが、 この設定ではヤンクの履歴がとれません。

Yankround.vim

一方で普通のヤンク作業ではYankround.vimという プラグインを使って前にヤンクしたものとかも呼び出せる様にしていました。

副作用の少ないYankRing.vimみたいなのができました - cafegale

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で入ったものです。

Vim の TextYankPost イベント - 書いたものなど

まさに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のアップデートで統一してクリップボードを共有して 履歴管理できる様になり結構便利になりました。

Sponsored Links
Sponsored Links

« Homebrewでxcrun: error Neovimで色が付かない問題 »

}