Vim のすゝめ

第4回 ビジュアルモード

2012.10.17

無人島に何か一つ持っていけるとしたら Vim を持っていく、Vim 使いの「ブイ」(仮名)です。第 4 回目のテーマは「ビジュアルモード」です。ビジュアルモードは初心者向けの機能で、Vim や vi のベテランからは馬鹿にされがちですが、なかなか奥の深い機能です。

ビジュアルモード [1] とは、任意の範囲を選択することができるモードのことです。普通のエディタによくある、マウスによる選択と似た機能と言えます。選択した範囲に対していろいろな操作をすることができます。

1 ビジュアルモードの代わりとなる機能

ビジュアルモードを使用しなくても、複数のキー操作によって Vim のカーソルを移動することができれば、同じことが行えます。削除やヤンクといったオペレータはカーソルの移動した位置までに作用するからです。例えば、

hoge|
piyo
hogehoge

という行があったとして、piyo の行まで削除したいとしましょう。ただし、カーソルは | の位置にあるとします。その場合は、d/piyo と入力すれば OK です。”d” という削除オペレータが “/piyo” でカーソルが移動した範囲までに作用し、結果として piyo の検索位置までテキストが削除されることになります。

操作したい場所がカーソルから遠い場合はどうすればよいでしょうか。そのときは、マークという機能が使用できます。

hogehoge
...
...
...
piyopiyo

という行があるとして、hogehoge から piyopiyo までを削除したいとします。... の部分には 1000 行ほどあると考えてください。dd を連打して一行ずつ削除していくと、途方もない時間がかかります。間に何行あるか分からないので、{count}dd [2] も用いることができません。

マークを使用して削除するには、まず hogehoge の部分でマークします。マークするには m{マーク記号} というキーを入力します。例えば、ma とするとa に現在位置が記録されます。次に、piyopiyo まで移動します。移動したら、d`a と入力をします。すると、カーソル位置から ma で記録された位置までが削除されるのです。

マークは大変便利な機能ですが、どこにマークがされているのか分からないので、マークした場所をすぐに忘れてしまうといった欠点があります。もし操作対象を間違えてしまった場合、アンドゥするのも手間です。

2 ビジュアルモード

では、先ほどと同じ例をビジュアルモードを用いてやってみましょう。

hogehoge
...
...
...
piyopiyo

“hogehoge” のところにカーソルを置き、v を入力します。そして、”piyopiyo” までカーソルを移動します。d を押すと、選択した領域が削除されます。マークを押したときとは異なり、選択した範囲が色分けされて表示されるので大変分かりやすいです。範囲を選択してから y を押すと、領域がヤンクされます。これも良く使用します。範囲を選択してから p を押すと、選択した領域にペーストすることも可能です。

行単位で選択することはよくあるので、V を押すと行単位の選択を行うことができます [3]。カーソルの桁位置を調整する必要がないため、便利です。

ビジュアルモードでコマンドを実行した場合、コマンドの対象が選択した領域に制限されます。例えば :sort コマンドでは、ソートの対象が選択範囲に制限され、一部のみソートするのが簡単に行えます。

3 矩形選択

ビジュアルモードにしかできない機能として、矩形選択があります。通常の選択では、選択開始位置から選択終了位置まで、行末を含んで選択されてしまいますが、矩形選択機能を用いると、選択開始位置から選択終了位置までを矩形領域で選択することができます。例を挙げます。

hogehogehoge
piyohogehoge
hoaahogehoge
bbbbhogehoge
aaaahogehoge

上記のような文字列があったとします。これの各行を “hogehoge” にしたいです。どうすればよいでしょうか。おそらく、皆さんが思いつく方法としては、行頭に移動して 4x、その作業を . を用いて繰り返すのではないでしょうか [4]。もしくは文字列を選択してから、:s.{4}// で先頭の文字を置換する方法もあります。どちらの方法も煩雑です。

矩形選択なら、もっと簡単な方法で領域の削除が行えます。先頭の h にカーソルを移動し、<C-v> を押してください。さらに、3l を押して “hoge” までを選択、4j を押して “aaaa” まで選択、あとは d を押します。矩形領域で選択された部分が削除されたはずです。<C-v> が矩形選択モードに入るためのキー入力なのです。矩形選択モードはビジュアルモードの一種です。

a,b,c,d
a,b,c,d
a,b,c,d
a,b,c,d

矩形選択を上記の CSV に対して適用してみましょう。CSV の要素である、b を c に順番を入れ替えたいとします。矩形選択で、まず一行目 b, を選択します。その後、3j で最後の行まで選択します。そして、d で領域を削除、c, までカーソルを移動して p を押します。要素の入れ替えが簡単に行えました。

さらに、矩形選択でしか行えない機能があります。複数行に同じ文字列を挿入することができるのです。これを応用し、シェルスクリプトのコメントアウトを行います。

echo "hoge"
echo "piyo"
echo "hogehoge"

上記の例で解説します。先ほどと同様、先頭の e にカーソルを移動し、<C-v> を押してください。さらに 2j を押して最終行まで選択し、その状態で I を押してください。’echo “hoge”’ の行でインサートモードに遷移すると思われます。そして、”#” を入力し、<ESC> でインサートモードを抜けます。すると’echo “hoge”’ だけでなく、選択された全ての行の先頭に”#” が挿入されるはずです。

実は矩形選択のとき、IA の挙動が変化します。行の先頭・末尾ではなく、選択領域の先頭・末尾全てに同じ文字列が挿入されます。ちなみに、この機能は矩形選択のときしか動作しません。通常のビジュアルモードの場合、選択された先頭の行のみ文字列が挿入されます。

次回は「アンドゥ」について解説する予定です。

[1]Vim には :visual というコマンドも存在しますが、これと Vim のビジュアルモードとは何の関係もありません。
[2]99dd のように、コマンドの前に数字をプレフィクスとして入力し、コマンドの実行回数を変化させることです。
[3]一応、v を用いても行単位の操作を行うことはできます。v を押してから、Y を押すと行単位のヤンクとなります。v を押してから、D を押すと行単位の削除となります。
[4]皆さんは知っていると思いますが、ノーマルモードで . を押すと直前の操作を繰り返します。
This article is made by Vim.

著者プロフィール

v

ブイ。社内では数少ない Vim 使い。ブログ記事の執筆により、社内でのVim の知名度を上げ、Vim を使用する人を増やそうと計画しているらしい。

記事一覧Index