単語単位に移動する
1文字ずつ動かしていては効率が上がりません。Vimには単語をひとまたぎする移動が用意されていて、実際の編集ではこちらを主に使います。w b e の3つで、前へ・後ろへ・単語の末尾へ、を押さえます。
Vimが「単語」と見なすもの
Vimの w における単語は、日本語の語や英単語とは少し違います。英数字とアンダースコアの連なりか、記号の連なりのどちらかが1単語で、空白が区切りになります。
たとえば price * count の上で w を押していくと、price → * → count と3回止まります。* も独立した単語として数えられるためです。user.name なら user → . → name です。
記号で止まってほしくないときは、大文字の W B E を使います。こちらは空白だけを区切りと見なすので、price * count は price → * → count と同じですが、user.name は丸ごと1単語として飛び越えます。
w と e を使い分ける理由
移動だけを見ると w と e はどちらでも目的地に近づけますが、この2つは後のレッスンで d(削除)や c(書き換え)と組み合わせたときに意味が分かれます。dw は次の単語の手前までを消すので単語の後ろの空白まで消え、de は単語の末尾までなので空白が残ります。
いまの段階では「w は頭、e は尻」だけ覚えておけば十分です。
1単語の範囲は iskeyword が決めている
「英数字とアンダースコアの連なり」という区切り方は固定ではなく、iskeyword というオプションで決まっています。手元の値は :set iskeyword? で確認できます。
CSSのクラス名やLispの関数名のようにハイフンを含む識別子を1単語として扱いたいときは、set iskeyword+=- を書き足します。すると font-size の上で w を押しても途中で止まらなくなります。ファイルの種類ごとに変えたい場合がほとんどなので、ftplugin 側に置くのが扱いやすくなります。
日本語では文字種の切り替わりが区切りになる
日本語を編集していると、空白が無いのに w が細かく止まります。Vimはひらがな・カタカナ・漢字・英数字を別の種類として扱い、種類が切り替わるところを単語の境目と見なすためです。「Vimの練習をする」なら Vim、の、練習、をする のあたりで止まります。
思ったより細かく刻まれるので、日本語の文章では単語移動よりも、あとのレッスンで扱う検索や行単位の移動のほうが当てになります。単語移動が効くのはコードを触っているときだと考えておくと、無駄な連打を減らせます。
ge の出番は限られる
ge は前の単語の末尾へ戻ります。b が前の単語の先頭に戻るので、日常的にはそちらで足りることがほとんどです。ge が効くのは、直前の単語の末尾に文字を足したいときです。ge で末尾に付けてから a で挿入すると、b のあと e と2回押すより1手少なく済みます。
4つの組み合わせを表にすると、w が「次の頭」、e が「次の尻」、b が「前の頭」、ge が「前の尻」で、前後と頭尻の2軸がきれいに埋まります。使う頻度は違いますが、この対称性を知っておくと ge だけ思い出せないという状態になりません。
このレッスンで扱うキー
| キー | 動き |
|---|---|
| w | 次の単語の先頭へ |
| b | 前の単語の先頭へ |
| e | 単語の末尾へ |
| W | 記号を飛ばして次へ |
| B | 記号を飛ばして前へ |
| ge | 前の単語の末尾へ |