「実践Vim」を読んで学んだこと - 第2章 ノーマルモード
モード
Vim初心者にとっては、Vimのとっつきにくい特徴かもしれない。Vimのユーザインタフェースにはモードがあるのだ。Vimを使っているときに、いまのモードが何モードなのかを把握していないと、Vimを使えない。
よく使わるモードには、ノーマルモードと挿入モードがある。挿入モードは他のテキストエディタに似た状態のことだ。つまり、押したキーどおりの文字が入力される。
しかし、Vimではノーマルモードというモードがあり、しかもそれがデフォルトになっている。この章ではノーマルモードの基本を学ぶ。
ノーマルモード
なぜ、他のテキストエディタには見られないノーマルモードというモードがデフォルトなのか。
本では、画家に例えられてその理由を説明している。画家が実際に筆を持ってカンバスに絵を描く時間を考え、実際にカンバスに何かを描く時間は絵を描くという仕事全体の時間に対して多くの割合にはならないだろうと説明している。
それと同じように、エンジニアがコードを記述するのは、仕事の一部でしかない。考え事をしたり、参考資料に目を通したり、コードベースのある場所から別の場所に移動したりといったことに、時間が使われている。
そして、ここが重要なのだが、コードの整形をしたり、コピーをしたり、移動したり、削除したり、何かの変更をしたいというとき、Vimでは他のテキストエディタのようなユーザーインターフェース(挿入モード)を使わない。他のテキストエディタとはそもそも根本的に考えが違うのだ。それらの編集・変更についてもノーマルモードで行うのである。
ノーマルモードには、そのための自由に使えるツールがたくさん揃っている。
変更単位に対する考え方
他のテキストエディタでは、単語をいくつか入力してからアンドゥコマンドを実行すると、最後に入力された単語か文字が元に戻される。でも、Vimではアンドゥコマンドの粒度を自分で制御できる。
u
キーを押すとアンドゥコマンドが実行され、直前の変更がなかったことにされる。
この変更とは、挿入モードで変更された内容、つまり、i
キーを押すと挿入モードになるが、そのモードの間押してキーの文字が入力される。その後、<Esc>
キーを押すとノーマルモードに戻る。このi
を押してから<Esc>
キーを押すまでの操作が単一の変更である。言い換えると、挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作が単一の変更なのである。そのため、u
キーを1回押すと戻る変更をノーマルモードに戻るタイミングで制御できるのだ。
他のテキストエディタのように1文字入力(または入力した何文字か)が戻るのではない。これがVimを特徴づける。
アンドゥの単位も変更だが、第1章で学んだドットコマンドで繰り返される単位も変更の単位だ。なので、同じような記述を複製したいときはそのまま.
を入力すると直前に作成した記述を繰り返すことができる。
変更を繰り返し可能なものにする
ここまで学んできたように、Vimは繰り返し処理に最適化されている。1つ1つの変更をどのように行うかを意識した記述ができてこそ、Vimは道具としての真価を発揮するのである。
そのため、繰り返しを意識しない記述方法をしていたのでは、Vimを使う意味が半減してしまう。
本では、単語を削除する例をとって、繰り返し性の高いVimの操作について説明してくれている。
回数指定による操作
Vimではドットコマンドで繰り返し操作できるが、他にも繰り返し操作する方法が提供されている。ノーマルモードのコマンドの多くは回数を指定して実行できる。
ノーマルモードで利用可能なコマンドの多くは、コマンドの前に回数を指定することで、指定した回数だけそのコマンドを実行する。
本では、簡単な計算を行う例を使って説明してくれている。
<C-a>
は数値の加算、<C-x>
は数値の減算を行う。このコマンドの前数字を入力すれば、その数字の分だけ加算/減算する。
例えば、下記のようなファイルを編集しているとき、j
やl
キーで80
の上にカーソルを置き、20<C-a>
を入力すると100
に変更することできる。
<table border="3"> <tr> <td width="80">Apple</td> <td width="120">Pineapple</td> </tr> </table>
ただし、回数指定はあらかじめ数字がわかっている必要があり、正確な回数指定は場合によってはストレスにもなる。
本では、臨機応変にドットコマンドとu
キーでインタラクティブに変更できるなら、そちらを選択した方が良いだろうって感じでアドバイスが書いてある。
Vimがなぜ強力なのか
ノーマルモードがなぜ強力なのか、その理由の大半は、オペレータコマンドとモーションを組み合わせられることに由来している。
オペレータ + モーション = アクション
d{motion}
コマンドは、単一の文字にも(dl
)、単語全体にも(daw
)、パラグラフ全体にも(dap
)適用できる。削除の範囲はモーションによって決められている。ここでd
コマンドはオペレータと呼ばれる。
よく使われそうなオペレータは次のようなものがある。
トリガー | 動作 |
---|---|
c |
変更 |
d |
削除 |
y |
レジスタにヤンク |
g~ |
大文字小文字の入れ替え |
gu |
小文字化 |
gU |
大文字化 |
> |
インデントを深くする |
< |
インデントを浅くする |
= |
自動インデント |
これらのオペレータの後にモーションを組み合わせることができるという文法のおかげで、モーションやオペレータを新しく学習するというのは、Vimのボキャブラリーを学習するようなものだ。このシンプルな文法規則に従えば、ボキャブラリーが増えるに連れて、より多くの考えを表現できるようになる。
シンプルなルールを設定することで、自由度を高められている例だと思う。これらの自由度の高いコマンドを実行できる環境がノーマルモードであり、挿入モードのようなインターフェースでは実現できない編集方法だと感じる。
オペレータ待機モード
Vimにはいくつかのモードがある。デフォルトのノーマルモード、文字をそのまま入力できる挿入モード、他にも範囲選択をするためのビジュアルモードなどだ。これらのモードは比較的わかりやすいが、オペレータ待機モードなるものがあるらしい。
オペレータ待機モードとは、ノーマルモードでオペレータコマンドを呼び出した後、モーションコマンドだけを受け付ける状態のことらしい。例えば、dw
コマンドを実行するときには、このモードを呼び出している。このモードに滞在するのは、d
キーを押してからw
キーを押すまでのほんのわずかな時間とのことだ。
このような一見なんのためにあるのかわからないモードだが、このモードがあるおかげでカスタムオペレータやカスタムモーションをユーザが作れるようになるということだ。
モードという概念による編集機能の住み分けによって、多様なコマンドの実行、単に押下したキーを入力する以上のことを実現可能になったのだと思った。世のテキストエディタをすべて知っているわけはないが、このようなアイデアによるテキスト編集はVimならではなのではないだろうか。シビレる。
続きは下記のリンクより