前回までにVimにおけるテキスト選択の基本を紹介した。効率的にテキスト選択をする方法もいくつか取り上げたので、練習すれば、かなり素早く任意のテキスト領域を選択できるようになっているはずだ。それを踏まえて今回は、選択した対象に処理を行う方法を紹介する。テキスト選択が本領発揮するのはここからだ。
選択からの削除
最もよく使うのは、任意領域を選択して一斉に削除を実施する操作だろう。これは、Vimに限らずエディタでは一般的に行われる操作である。
まず、削除したい領域を次のようにテキスト選択する。
テキスト選択した状態で「d」や「x」、「X」など削除を行う命令を入力すると、選択した領域が削除される。
なお、ここではテキスト選択として「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コマンドでソートされた結果が表示されていることがわかる。
このデータには重複が含まれている。ここで再び対象を選択してuniqコマンドを実行してもよいのだが、先ほどのテキスト選択の状態で「!sort」ではなく「!sort|uniq」と実行することで結果から重複を排除させることもできる。Vimではコマンドをパイプでつなげて処理できる。
結果は次のようになる。uniqコマンドも実行されており、重複した行が削除されていることを確認できる。
これはとても強力な機能だ。Vimを使いながらLinuxのコマンドをテキストに適用できることを意味している。いちいちVimを終了したり、ほかのターミナルで処理を行ってからテキストを持ってくるという必要もない。
テキスト選択とVim機能という強力コンボ
ここではテキスト選択を行ってからさらに命令を適用する方法を紹介した。これはVim独自の機能だ。源流となったviにはこうした機能はなく、「:開始行,終了行命令〜」といったように行ごとに範囲を明示しなければ同じようなことができない。
行範囲を手動で指定するのは思った以上にめんどくさい。Vimのテキスト選択機能でビジュアル的にテキストを選択した状態で命令をするほうが、より人間の感覚に合っている。この機能はデータ加工にも利用できる便利な機能なので、ぜひ今回も使い方を練習して習得してもらえればと思う。