vim tips その2

さて前回にひき続いてその2ですが、今回は主にビジュアルモードについてまとめたいと思います。

ビジュアルモードとは

範囲選択をし、それを対象にしてオペレータコマンドを実行することができます。
ちなみにこれはノーマルモードで「オペレータ」と「モーション」を組み合わせることでコマンドを実行することの逆転に等しいです。
ビジュアルモードでは先に「モーション」を指定して、それに対する「オペレータ」を実行するように解釈できます。

ビジュアルモードへ遷移する

まずビジュアルモードには三種類存在します。
ひとつは「文字指向」のビジュアルモードで文字単位での選択の際に利用できます。
またひとつは「行指向」のビジュアルモードで行単位での選択に利用できます。
最後に「ブロック指向」のビジュアルモードがあり、これは矩形選択を可能にします。

それぞれのモードへ遷移するショートカットは下記のようになります。

キーバインド 操作
v 文字指向のビジュアルモードへ遷移する
V 行指向のビジュアルモードへ遷移する
Ctrl-v ブロック指向のビジュアルモードへ遷移する
gv 直前のビジュアル動作を繰り返す

ビジュアルモード間を移動する

一旦なにかしらのビジュアルモードへ遷移すると、開始地点が固定される形となります。
ビジュアルモードに遷移した後に、カーソルを移動すると現在のカーソル位置を終点として現在繊維中のビジュアルモードに依存した範囲選択が適用されます。

ようするにビジュアルモードでは開始地点と終了地点とビジュアルモードの3つにより選択範囲が決定されます。
そのうちビジュルモードに関しては、開始地点と終了地点を変更することなく、モードだけの変更が可能です。
そのキーバインドはノーマルモードから遷移する際と同様です。シンプルですね。

また特定のビジュアルモードにある状態で、もう一度そのモードに遷移するキーバインドを実行すると今度はノーマルモードに遷移します。
つまり、ノーマルモードとビジュアルモードを切り替えるトグルとして機能するということです。これもまたシンプル。

またoキーをタイプすることで、開始地点と終了地点を入れ替えることができます。
これによって開始地点を誤って設定してしまった時に一度ビジュアルモードを抜けてノーマルモードになって・・・などという手順を踏まずに開始地点を変更することができます。便利。

使いドコロ

実際どんなことに使えるのかなというところをいくつか例にとってみてみましょう。

  • マルチカーソル(削除)
  • sublimeなんかである今っぽい感じの機能が擬似的に使用できます。
    例えば下記のような共通プレフィクスを消去したいときなどを考えましょう。

    <a href="http://prefix.example.com/A"></a>
    <a href="http://prefix.example.com/B"></a>
    <a href="http://prefix.example.com/C"></a>
    

    Ctrl-vを用いた矩形選択を行い、横一列、縦三行の矩形を選択します。
    あとはx(削除)をタイプすれば3行同時に編集することが可能です。こんな使い方もできます。

  • マルチカーソル(挿入)
  • 同様に複数行に一気に編集を行いたい場合、それも矩形選択で可能です。
    例えば下記のようなhttpリンクにさらにサブホスト名を追加したい場合を考えましょう。

    <a href="http://prefix.example.com/A"></a>
    <a href="http://prefix.example.com/B"></a>
    <a href="http://prefix.example.com/C"></a>
    

    まずははじめの行のprefixのpの位置にカーソルをおきCtrl-vで矩形選択ビジュアルモードへ移動します。
    そこからjjをタイプし、横一列、縦三行の矩形を選択します。
    そこからIキーをタイプすることで、挿入モードへ遷移できるので、そこで追加したサブホスト名を入力すれば完了です。

    この時点でははじめの一行目しか編集されていないように見えるが最後にノーマルモードへと遷移すると矩形選択していた三行に同じ編集が適用されます。

    マルチカーソルなどは最近のエディタから付随していた機能かと思いましたが、随分昔からあるんですね。素晴らしいです。

  • 水平線見出し
  • 行選択とテキスト置換処理を行うことでテキストベースでの区切りなんかを生み出せます。
    例えば下記のようなデータが有り、ヘッダとボディ項目の間に区切りを入れたい時なんかを考えましょう。

    key value
    hoge - 1
    fuga - 2
    

    カーソルを左上に置いた状態でyypからのVで行選択、さらにr-を押下することで行すべてをハイフンに置換でき、即席の区切りができたりします。

    欠点

    ビジュアルモードは万能というわけではなくノーマルモードによる操作のほうが適した場合もあります。

    とりわけ繰り返し動作を行う際に、意図したものと異なる結果となることが多いです。
    ビジュアルモードは操作を範囲として選択するため、繰り返した際にもその「オペレータ」として機能した範囲が以前の動作に引きずられて固定されます。

    ピンポイントに行の中間での可変長なエリアでの編集処理というところは苦手であるので、そういった時はオペレータを用いたノーマルモードでの編集が有効です。

    まとめ

    欠点も少しありますが、vim全体としては無くてはならない機能です。
    特にマルチカーソルは使いこなせば非常に作業効率を上げることが出来る機能であるので是非理解してほしい機能です。
    是非使用してみてください。


    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です