vimのgnモーションはすごく便利、かもしれない。

実践vimをぱらぱら読んでいたら訳注のところでgnとかいうものが紹介されていたのですが、解説が無く。気になって調べてみたので、使い方をメモ。

例えば以下のような謎プログラムがあるとします。

datatimeAlpha = alpha
datatimeBeta = beta
dataFile = filename

datetimeとすべきところをdatatimeと書いてしまって悲しい気持ちです。 悲しいのできちんと直すのですが、:%s/datatime/datetime/とするのは長ったらしくて面倒くさい。

そこでとりあえず、/dataで検索して、最初の行のdatatimeの先頭までジャンプします。 ctAdatetimeとしても目的は達成出来るのですが、ちょっと長い。

てっとりばやく処理するために、gnの登場です。gnはマッチ全体を示すモーションらしいです。次のマッチを示すgnと、前のマッチを示すgNの二通りがあります。 先ほどの場所から、cgnとしてみてください。dataの範囲が消えてインサートモードに入ります。あとはdateって書くだけ。 直せたらnで次のマッチに飛んで、ドットコマンドでもう一回置換します。 更に飛ぶと今度は正しいdataなので、置換終了。みたいな感じ。

なお、gnモーションは次のマッチ全体を示すものなので、いちいちnコマンドで次に飛ぶ必要はありません。ドットコマンド連打でも全部置換できます。 とはいえ無闇に連打してると関係無いもの(この例では最後の行)を巻き込みそうだし、マッチが確実に正しいなら:sで置換しちゃった方早いだろうし。 nとドットを交互に繰り返す方が良いのではないかと、個人的には思います。

結構便利な気がする。置換コマンド呼ぶほど箇所が大くない時とかに活躍する、かも?

参考: 「実践Vim 思考のスピードで編集しよう!」レビュー (1日目) - Humanity