読者です 読者をやめる 読者になる 読者になる

反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

Vim でコピペするときの Tips

Vim

この記事は Vim Advent Calendar 2012 の 40 日目の記事です。
昨日は @kokukuma さんのなんかvimがセグメンテーションフォルト吐いたんですけど。。でした。

はじめに

プログラミングに限らず、何かを書くときにコピー&ペーストってよく使いますよね。Vim でも当然その機能はありますが、Vim の場合はレジスタという仕組みによってさらに便利に使うことができます。
今回は、私が最近覚えてすごく便利に思ったコピー&ペーストに関する小ネタを書きます。

前提知識 レジスタとは

文字列を y でコピー(Vim ではヤンクといいます)すると、その文字列は無名レジスタに蓄えられます。d とか c とかで削除した時も同様です。無名レジスタに記録された文字列を貼り付けるには単純に p や P を使います。
"ayy とか "bdw とすると、明示的に a レジスタや b レジスタに書き込みます。こうすると、たくさんの文字列を記録させることができます。明示的にレジスタを指定して貼り付ける時は "ap や "bP などとします。
詳しくは :h registers してください。
ちなみに :reg とすると、現在のレジスタの一覧を参照できます。

0(ゼロ)レジスタで同じ文字列を何度も貼り付ける

y でヤンクした文字列をいろんな場所に貼り付けるということはよくあると思います。普通にいろんな場所に p で貼り付ければいいのですが、困るのが途中で編集をして関係ない文字列を削除してしまった時。せっかくヤンクした文字列が上書きされてしまって貼り付けられなくなってしまった。
実はヤンクされた文字列は 0 というレジスタにも自動的に入ります。そして、削除などでは 0 レジスタは使われません。なので、

"0p

と打てばヤンクされた文字列をいつでも使うことができます。

別解

明示的に _ レジスタに書き込むと無名レジスタは使用されなくなります。なので削除するときに "_dd などとすると、その後も単純に p でヤンクした文字列を貼り付けることができます。

* レジスタクリップボードと連携する

ネットの海をさまよっていたら、Vim のナイスな設定を見つけた!よし、自分の .vimrc にコピペしよう。
あまりお行儀は良くないですが、ブラウザなど他のアプリケーションにある文字列を Vim で使うにはクリップボードを使うと便利です。ブラウザなどで Ctrl+C でコピーしたあと、Vim

"*p

とすると、クリップボードの内容を貼り付けることができます。*1
逆にクリップボードに文字列を書き込むには "*yy などとします。*2

<C-R>でインサートモードから貼り付け

インサートモードにいるときに、ヤンクした文字列を貼り付けたくなったら・・・?インサートモードで

<C-R>"

とすると、ノーマルモードに戻らずに無名レジスタの内容を貼り付けることができます。<C-R>のあとはレジスタを指定できます。<C-R>a で a レジスタの内容を貼り付けます。無名レジスタのときは " です。
あと、<C-R> による貼り付けはコマンドモードでも使えます。

/ レジスタでさっき検索した文字列を挿入

/ や ? で検索した文字列は自動的に / というレジスタに格納されています。これが何の役に立つかというと、正規表現をつかって置換をするときに便利です。
まず、/ を使って正規表現を検索して自分が望む文字列を検索できているかを確認します。

以下を入力すると・・・

:%s/<C-R>/

以下のように即座に置換コマンドにするできます。

追記

単純に前回の検索パターンを使って置換を行うには下記で良いとのこと。

:%s//hoge/

id:deris さん、情報ありがとうございました。

コマンドモードでカーソル位置の単語を貼り付け

地味だけどすごく便利な機能です。
下の図のような(exists にカーソルがある)ときに

このように入力すると

:help <C-R><C-W>

exists 関数についてのヘルプを引くことができます。

おわりに

いかがだったでしょうか。Vim を使いこなしている方には結構当たり前なことだったかもしれないですが、私は最近知ったので半分は自分の備忘録として書きました。
間違いや補足、他にもこんな事出来るよというのがあればコメントいただけると幸いです。

次回は @Qvic_ さんです。

*1:* レジスタがうまくいかないときは + レジスタだとできるかも?

*2:set clipboard=unnamed すると自動でクリップボードにも書き込まれる