端末上の Vim からローカルにコピーする


端末アプリ + GNU Screen を使ってリモートサーバでコーディングしているとコピー & ペーストで詰まることがよくある。Screen 内でコピーした文字列を手元のブラウザで検索しようとしたとき、マウスでドラッグして選択するしか方法がないので、いちいちキーボードから手を離すのが億劫だったのだ。それを解決してくれるのがこれ。

ssh先screenのペーストバッファをクリップボードに貼り付ける – Keep It Simple, Stupid
http://yskwkzhr.blogspot.com/2011/04/copying-remote-screen-paste-buffer.html

参考サイトの通りに設定すると、たとえば Ctrl + aCtrl + ] を押すことでコピーした内容がローカルのクリップボードに貼り付けられる。後はメモ帳でも Firefox でも何にでも貼り付ければいい。


110809-0001.png

端末中の vim からローカルにコピーする

で、これを使ってるとき、同じ手段を執れば端末中の vim からローカルにコピーすることもできるんじゃないかと考えた。そこで作ったのがこの vim スクリプト。

" yank to remote
let g:y2r_config = {
            \	'tmp_file': '/tmp/exchange_file',
            \	'key_file': expand('$HOME') . '/.exchange.key',
            \	'host': 'localhost',
            \	'port': 52224,
            \}
function Yank2Remote()
    call writefile(split(@", '\n'), g:y2r_config.tmp_file, 'b')
    let s:params = ['cat %s %s | nc -w1 %s %s']
    for s:item in ['key_file', 'tmp_file', 'host', 'port']
        let s:params += [shellescape(g:y2r_config[s:item])]
    endfor
    let s:ret = system(call(function('printf'), s:params))
endfunction
nnoremap <silent> <unique> <Leader>y :call Yank2Remote()<CR>

これを .vimrc 内に書いておくと、<Leader>y(標準では \y)とタイプすることで、最後にヤンクした文字列がローカルにコピーされる。y2r_config というのがオプション。

tmp_file
ClipboardTextListener で指定する、GNU Screen からコピーされた文字列が入るファイル。
key_file
ClipboardTextListener の事前共有キー。
host
ClipboardTextListener の起動するホスト。
port
ClipboardTextListener の起動するポート番号。

上の SS では何をやっているかというと、VMWare 上の WindowsXP + cygwin + Vim からローカルマシン(Mac)のクリップボードにテキストを転送し、それをテキストエディットに貼り付けている。まあこんな用途なら VMWare Tools 使えって話やけどね。Vim 上でキーボードだけで全部すむことに意味があるのだ。多分。

コメントを残す