Mac の Vim でレジスタの内容をペーストボードに入れる

D とか y とかやったあとに、その内容をペーストボードに入れたいことがあるので、そういうコマンドを考えてみた。

:call system("printf %s " . substitute(shellescape(@0), "\\\\\n", "\n", "g") . " \| pbcopy")

substitute してるのは、それがないと改行の前の \ が残ってしまうため。


で、vimrc にもこんなふうに書いておいた。

map sc :call system("printf %s " . substitute(shellescape(@0), "\\\\\n", "\n", "g") . " \| pbcopy")<RETURN>

範囲選択して、y とか押して、sc と押すとペーストボードに入る。


また、

map sp :r! pbpaste<RETURN>

としてあるので、sp と押すとペーストボードから貼り付ける。

コメント欄より

:call system("pbcopy", @0)

でよかったらしい。vimrc に書くなら

nnoremap sc :call system("pbcopy", @0)<CR>

か。nnoremap はノーマルモードでデフォルトのショートカットを置き換えるときに使うとか。再帰できないようにする? とかよくわからないけど。

@0 より @" のほうがいい

@0 はヤンクしたときに入るレジスタで、@1 は dd などで消したときに入るレジスタらしい。@" はそれらを気にせず次にペーストされるものが常に入ってるらしい。

今はこんな感じになった。

" copy to clipboard
if has("unix") && match(system("uname"),'Darwin') != -1 " mac
  " http://www.mail-archive.com/vim-latex-devel@lists.sourceforge.net/msg00773.html
  nnoremap fc :call system("pbcopy", @")<CR>
  nnoremap fp :r! pbpaste<CR>
elseif has('win32unix') " cygwin
  nnoremap fc :call system("putclip", @")<CR>
  nnoremap fp :r! getclip<CR>
endif

sc, sp でずっと動いてたんだけどなぜか急に s が一文字消して編集モードに入るのになってしまったので fc, fp にした。