前回までにVimにおけるテキスト選択の基本を紹介した。効率的にテキスト選択をする方法もいくつか取り上げたので、練習すれば、かなり素早く任意のテキスト領域を選択できるようになっているはずだ。それを踏まえて今回は、選択した対象に処理を行う方法を紹介する。テキスト選択が本領発揮するのはここからだ。

選択からの削除

最もよく使うのは、任意領域を選択して一斉に削除を実施する操作だろう。これは、Vimに限らずエディタでは一般的に行われる操作である。

サンプルとして使用するテキストファイル

まず、削除したい領域を次のようにテキスト選択する。

削除したい領域をテキスト選択

テキスト選択した状態で「d」や「x」、「X」など削除を行う命令を入力すると、選択した領域が削除される。

「d」など削除用の命令を入力して選択した領域を削除

なお、ここではテキスト選択として「V8↓」といった命令を使っているが、「V26G」でも同じ操作になる。「V」で行選択を開始、「26G」で26行目まで選択、という命令になる。こんな感じでVimには呪文じみた命令が山のようにあり、さらに組み合わせによって数限りない命令を生成できる。この辺りが、Vimが”沼”となっている理由の1つだろう。

削除はコメントを消す場合などにも使える。コメントは行の先頭に記述されていることが多く、この部分を矩形選択して削除すればコメントを外す処理になる。

選択からの置換

選択領域に対する置換処理も、よくやる作業だ。例えば次のサンプルを操作する例を考える。

サンプルのテキストファイル

30行目から32行目までを、22行目から24行目と同じように加工するとしよう。まず、次のように3行分をテキスト選択する。

加工したい行をテキスト選択

この状態で「:s/^/ <item><p>/」と入力する。すると、下部に「:’<,’>s/^/ <item><p>/」という表記が現れる。

置換命令を入力

「’<,’>」というのはVimによって自動的に挿入されたもので、テキスト選択した領域のことを指している。「’<,’>s/^/ <item><p>/」を意味ごとに整理すると次のようになる。

命令 内容
‘<,’> テキスト選択されたものが対象
s 置換せよ
^ 置換前文字列(^は行頭を意味する)
<item><p> 置換後文字列

置換命令は基本的に「s/置換前文字列/置換後文字列/」だと考えておいてもらいたい。この状態で「Enter」キーを押すと置換が実行され、次のような状態になる。

置換を実行した後

行末についても似たような操作で加工が可能だ。まず、同じように対象を行選択する。

加工したい行をテキスト選択

先ほどと同じように置換命令を入力する。今度は「:s/$/<\/p><\/item>/」だ。「$」は行末を意味するほか、区切り文字が「/」なので、置換後文字列中の「\」はエスケープして「\/」と表記されている。

置換命令を入力

リターンキーを押すと、次のように置換が実施される。

置換を実行した後

置換命令は難しいように見えるかもしれないが、慣れればそうでもない。またVimには命令の履歴機能があるため、「:」キーを押した後で「↑」を押すことでこれまでに入力した命令を表示させることができる。「:s」まで入力してから「↑」を押すと置換命令のみの履歴を表示することができるなど、入力の手間を省くことができる。

置換処理を使うと、選択した領域をまとめてコメントに変更することができる。コメントの開始は行の先頭に書くことが多いので、行頭をコメント開始の文字列に置換すればよい。

選択からのコマンド実行

テキスト選択は、データの加工にも利用できる。例えば、次のようなテキストサンプルを考える。

サンプルのテキストファイル

ここで次のようにリストを選択する。

コマンドに流し込みたい対象をテキスト選択

テキスト選択したら「!sort」と入力する。「!」はコマンドを実行せよという命令、その後に書いてあるのはコマンドだ。Vim的にはテキスト選択した対象に対して行われるので「:’<’>!sort」という命令になる。Vimの下部には「’<’>!sort」と表示されていることがわかるだろう。

sortコマンドを実行

実行結果は次のようになる。sortコマンドでソートされた結果が表示されていることがわかる。

整列後データに重複があることがわかる

このデータには重複が含まれている。ここで再び対象を選択してuniqコマンドを実行してもよいのだが、先ほどのテキスト選択の状態で「!sort」ではなく「!sort|uniq」と実行することで結果から重複を排除させることもできる。Vimではコマンドをパイプでつなげて処理できる。

コマンドはパイプラインでつなげて実行してもよい

結果は次のようになる。uniqコマンドも実行されており、重複した行が削除されていることを確認できる。

整列および重複排除の実行結果

これはとても強力な機能だ。Vimを使いながらLinuxのコマンドをテキストに適用できることを意味している。いちいちVimを終了したり、ほかのターミナルで処理を行ってからテキストを持ってくるという必要もない。

テキスト選択とVim機能という強力コンボ

ここではテキスト選択を行ってからさらに命令を適用する方法を紹介した。これはVim独自の機能だ。源流となったviにはこうした機能はなく、「:開始行,終了行命令〜」といったように行ごとに範囲を明示しなければ同じようなことができない。

行範囲を手動で指定するのは思った以上にめんどくさい。Vimのテキスト選択機能でビジュアル的にテキストを選択した状態で命令をするほうが、より人間の感覚に合っている。この機能はデータ加工にも利用できる便利な機能なので、ぜひ今回も使い方を練習して習得してもらえればと思う。