VimとWindows コピーの違い
Vim <=> Windows コピーの違い
Vimを使い始めてから少し経つとめっちゃ不便やん、と思うことがありました。
それがVimとWindowsのコピーの違いです。
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のドキュメントの多さには感服ですね。。。