World Wide Wonderful RSSフィード

2008-05-03 VimとWindows コピーの違い

[] VimWindows コピーの違い 02:15  VimとWindows コピーの違いを含むブックマーク

Vim <=> Windows コピーの違い

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

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

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

で、何が不便なのか

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

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

register(レジスタ)

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

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

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

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

通りすがり通りすがり 2008/05/08 17:43 .vimrc に、
set clipboard+=unnamed
と書いておくと同期しますよ。

orangehatorangehat 2008/05/11 02:00 どうやら無名レジスタに入るデータを*レジスタにも入れるというもののようですね。
これは全然知らなかったですね。

ありがとうございます!!

eclipse-aeclipse-a 2008/07/09 10:08 つ mswin.vim