VimとWindows コピーの違い

Vim <=> Windows コピーの違い

Vimを使い始めてから少し経つとめっちゃ不便やん、と思うことがありました。
それがVimWindowsのコピーの違いです。

Windowsでは、コピーというのはCTR + C(以下)でコピーし、で貼り付けをします。
ワードやエクセル、Firefoxでの文字列のコピーなど全てそれで済んでしまいます。
正式な名前は「クリップボードへコピー」というやつで、OSの共有メモリ?に書き込むことでコピーをしているようです。

しかーしVimは違います。Vimではも使えません。
んじゃ何を使うんやということですが、言わずと知れた「y」です。
まあ、「yy」でカーソルのある行をコピーし「p」で貼り付けるのはVimをほとんど知らない人でも使う機会も多いかと思います。
これはVimのメモリに保存しているようです。
ちなみに、名前も「コピー」ではなく、「ヤンク」というそうです。

で、何が不便なのか

それはというと、たとえばあるPHPの関数をググるとします。
そうして見つかったものは、たとえば、ものすごく長い関数だったとします。
すると、やっぱりタイプミスすることが目に見えているわけで、あなたはでコピるわけです。
でもいざ、Vimで編集しているPHPのプログラムにはが使えない!?
わざわざ右クリック > 貼り付け なんてことをしなくちゃいかん。

というパターンです。めっちゃ不便です。
まあ保存している場所が違うんやから当たり前か。。。

register(レジスタ)

実際使えんなんてことはあるわけないやん、ということで調べてみるともちろん方法があります。
それが「"*p」です。
これは何かというと、レジスタというものです。

キー操作 意味
"ay 選択範囲をレジスタ a に保存
"ayy 今いる行をレジスタ a に保存
"ap レジスタ a の内容をカーソル位置にペースト
:reg レジスタに格納されている情報を一覧表示

レジスタ名は a 〜 z までの26文字のアルファベットが使用でき、それぞれに文字列をヤンクしたり、それをペーストできたりするわけです。
で、Windowsの「クリップボードへのコピー」は特例としてレジスタ「*」(アスタリスク)に登録されるので、「"*p」Vimに貼り付けができるわけです。
だからVimで選択した部分を「"*y」としてやると、Vim以外のアプリケーションでで貼り付けができたりするわけです。

ちなみに、以下のような特例もあるようです。普段使っている「yy」なんかもレジスタの一つの使い方に過ぎないんですね。

キー操作 レジスタ 備考
yy(カーソル上の行コピー) 「0」,「"」など 「"0p」などで貼り付け
x(カーソル上の文字削除) 「"」など 「""p」などで貼り付け
dd(カーソル上の行削除) 「"」など 「""p」などで貼り付け
何もしなくても 「%」 現在開いているファイル名が格納されている

よくイライラする「yy」でヤンクしたのに、ペーストする前に「x」とか押しちゃって、コピーしたはずの「yy」の文字列が「x」で切り取った文字に変わってしまっているのは、これが理由です。
つまり、実際は、

キー操作 レジスタ 実際のキー
yy 「"」 ""yy
p 「"」 ""p

となっているわけで、前に示したとおり、「x」レジスタ「"」を使っているので上書きされちゃうんですね。
でも「yy」などのコピー系操作は「"」と同時に「0」にも格納されるので、「"0p」としてやればよかったりします。
まあ詳しくは、http://www.ac.cyberhome.ne.jp/~yakahaira/vimdoc/change.html#registersでも読んで下さいな。

それでもやっぱり不便だ。

何が不便かというと、「"」がひたすら押しにくい。。。
SHIFT + 2ってのがほんまに押しにくい。これって結構致命的。

ということでマッピングで解決させました。
以下をvimrcに書きます。

" 選択部分をクリップボードにコピー
vmap <C-C> "*y

" 挿入モード時、クリップボードから貼り付け
imap <C-V> <ESC>"*pa

" 選択部分をクリップボードの値に置き換え
vmap <C-V> d"*P

" コマンドライン時、クリップボードから貼り付け
cmap <C-V> <C-R>*

" 選択部分をクリップボードに切り取り
vmap <C-X> "*d<ESC>

ちなみに、

マッピング 意味
cmap コマンドライン時に使われるマッピング
imap 挿入モード時に使われるマッピング
vmap ビジュアルモード時に使われるマッピング

という感じです。
これで普段のWindowsと同じ感覚でが使えたりします。
マッピングの詳細については、http://www.ac.cyberhome.ne.jp/~yakahaira/vimdoc/usr_40.html#40.1を読んで下さいな。
まあそれにしても、調べてもなかなか出てこなくてここまで調べるのにやたら苦労したわけですが、Vimのドキュメントの多さには感服ですね。。。