最近 Neovim に移行したのですが,Macvim で可能であったビジュアルモードで範囲指定して Ctrl-C でクリップボードへのコピーができなくなりました.
そこで,Neovim 開いたファイルをクリップボードにコピーする方法を調べました.
vim のレジスタ
vim ではヤンクや削除するとレジスタに値が保存されます.レジスタには次のような種類があります.
無名レジスタ
特にレジスタ名を指定しない場合に利用されるレジスタ.yy
ではカーソルがある行を無名レジスタに保存し,p
では無名レジスタから値を持ってきて貼り付けます.
指定したレジスタ
保存するレジスタ名を指定してヤンクすることも可能です.指定の方法は"レジスタ名
となっています.
例えば,レジスタ r にヤンクしたいときは,"ryy
となります.
0(ゼロ)レジスタ
また,vimには特殊なレジスタとして,0(ゼロ)レジスタというものが存在します.指定の方法は"0
となっています.
このレジスタはヤンクされた値は保存しますが,削除された値は保存されません.
以下の gif はその動作例です.
- yy -> {無名 = "first line", 0 = "first line"}
- dd -> {無名 = "second line", 0 = "first line"}
といったようにレジスタの値が遷移しています.
クリップボードのレジスタ
そして,レジスタとしてクリップボードを指定することも可能です.指定の仕方は"*
となっています.
以下の map を ~/.config/init.vim や .~/vimrc に追加することで,vim でもクリップボードを活用できるようになります.
init.vim
" copy & paste map
nnoremap <Space>d "*dd
vnoremap <Space>d "*dd
nnoremap <Space>y "*yy
vnoremap <Space>y "*yy
nnoremap <Space>p "*p
vnoremap <Space>p "*p
:r!pbpaste
はそれぞれ
:r
コマンドの出力を挿入する!pbpaste
クリップボードの値を出力する Mac のコマンド
となっており,クリップボードを活用できていることが確認できました.
インサートモードでクリップボードから paste したいときは,<C-r>*
でできますが,普通に Command-v でも paste できるので特に map しなくてもいいかなと思いました.