ビジュアルモードでテキストを選択し加工するいまさら聞けないVim(5)(2/3 ページ)

» 2011年06月15日 00時00分 公開
[後藤大地@IT]

矩形選択機能の活用

 通常のテキストエディタを使っているときは、矩形選択ということをあまりしないので、ビジュアルブロックモードの活用シーンが浮かんでこないかもしれない。矩形選択はシーンによってはとても便利な機能で、あるとないとでは作業効率に雲泥の差が現れることがある。次に矩形選択の利用例を示す。

 例えば図10のようにコメントのマークだけを矩形選択してコピーするということもできる。[Ctrl-v]でビジュアルブロックモードに入り、[y]でコピーだ。

図10 コメントのマーク部分だけを矩形で選択する。ビジュアルブロックモードに入るキーは[Ctrl-v] 図10 コメントのマーク部分だけを矩形で選択する。ビジュアルブロックモードに入るキーは[Ctrl-v]

 コメントのマークをコピーしたら、それをペーストしてみよう。まずは、ペーストしたい部分にカーソルを移動させる。このとき、ペーストを開始地点としたい場所の1文字左にカーソルを移動させる(図11)。

図11 ペーストしたい場所にカーソルを移動させる 図11 ペーストしたい場所にカーソルを移動させる

 ここで[p]を押すと、先にコピーした矩形を、カーソルの右側にペーストできる(図12)。選択した矩形がそのままそこに割り込むような形になる。カーソルの左側へペーストしたいなら[P]を押せばよい。

図12 [p]を押すと、カーソルの右側にテキストをペーストできる 図12 [p]を押すと、カーソルの右側にテキストをペーストできる

 削除も同様の手順だ。矩形に選択して[x]や[d]を押せばよい。

 縦方向に揃っているデータを編集するときも、この矩形選択は便利に活用できる。例えば列を移動したい場合など、矩形選択を利用すれば簡単に処理できる。矩形選択が使えないと、いったんスクリプトやプログラムを組むなどしてデータを加工しなければならないが、Vimのビジュアルブロックモードを使えばそうした処理を簡単に実現できる。

コメントマークの付け外し

 プログラミングでVimを使うと、ビジュアルモードで選択して対象をコメントに置き換えたり、または追加したコメントマークを削除する、といったことができる。1行1行手動で入力していっては切りがない。こういうケースでブロックモードを活用するのだ。

 複数行にコメントマークを付ける方法を解説しよう。ブロックモードでコメントマークを付けたい部分を選択し、「:」を押す。

 するとビジュアルモードからコマンドラインモードに移行する。入力欄には最初から「:'」と入っている。これは「ビジュアルモードで選択したテキストを処理の対象とする」という意味だ。

 行頭に「//」といったコメントマークを挿入したいなら、「:'」に続けて「s/^/\/\//」と入力すればよい。置換は「s/置換対象/置換後文字列/」で指定する(図13)。

図13 行の先頭に「//」というコメントマークを挿入するためのコマンド 図13 行の先頭に「//」というコメントマークを挿入するためのコマンド

 「^」は行頭を意味しており、「\/\/」は「//」を意味している。置換指定の区切りに「/」が使われているので、ただの文字として表現するために「\/」のようにエスケープしているのだ。実行すると、行頭に「//」というコメントマークを挿入できる(図14)。

図14 コメントマーク挿入後 図14 コメントマーク挿入後

 このタイプのコメントマークは、矩形選択で選択して削除すれば、簡単に元に戻せる。

 挿入する文字の指定方法を工夫すると、「/* ... */」といったC言語風のコメントマークの挿入もできる。操作手順は同じだが、図15のように置換の指定方法を変えてやればいい。

図15 行末と行頭に「/* 」と「 */」を挿入するコマンド 図15 行末と行頭に「/* 」と「 */」を挿入するコマンド

 「:'」に続けて「s/^\(.*\)$/\/* \1 *\//」と入力する。エスケープが多いので呪文のように見えるが、慣れれば読めるようになる。置換対象は「^\(.*\)$」。「^」が行頭で「$」が行末を意味している。.が任意の1文字に一致し、*は0回以上の繰り返しを意味している。つまり「^.*$」でその行の内容すべてに一致する

 「\(任意の対象\)」とすると、この中に一致したものが、置換後の指定で「\1」として参照できる、という意味になる。つまり「^\(.*\)$」で行の内容すべてに一致し、その内容は「\1」で置換後の指定で利用できる。

 置換後を指定している部分は「\/* \1 *\/」だ。エスケープが入っているので分かりにくいが、「\/*」が「/*」を表現し、「*\/」が「*/」を意味している。\1はこの場合は行の内容すべてになっているので、「\/* \1 *\/」は行頭に「/* 」を追加し、行末に「 */」を追加するということになる(図16)。

図16 図15のコマンドを実行した結果 図16 図15のコマンドを実行した結果

 この種のコメントマークを追加した場合、削除するには[x]や[d]ではなく、同じように置換機能で処理してやればよい。要するに行頭と行末の3文字づつを削除すればよいので、指定は「:'」に続けて「s/^...\(.*\)...$/\1/」とすればいいわけだ。

 この場合、行頭は矩形選択でまるごと削除して、行末だけ置換で削除するという方法もある。どんな方法を使ってもよいし、好みの問題もあるのでやりやすい方法を覚えておけばいい。

 正規表現の活用と置換の指定は、慣れないと呪文のように見えるが、ちゃんとした規則があり、そして互換性もそれなりに高い。Vimでもsedでもawkでもなんでもいいが、一度ある程度の正規表現と置換指定の方法を覚えてしまえば、さまざまなツールやコマンドで利用できて作業効率がけた違いに上がる。Vimで一歩上のスキルを身に付けるには、取り組んで覚えてしまいたい分野といえる。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。