Vimの単語移動8種類 w/b/e/geとW/B/E/gEの違い
vim-config.jsonのような記号混じりの文字列でwを押したら、思ったより手前で止まってしまいました。単語の区切り方には2つの流儀があり、これを知らないと単語移動が思い通りに動きません。
| キー | これだけ覚える |
|---|---|
| w | 次の単語の先頭へ |
| b | 前の単語の先頭へ戻る |
| e / ge | 単語末尾へ進む / 戻る |
| W / B / E / gE | 大文字版:空白でしか区切らない |
基本の4つ
| キー | 動作 |
|---|---|
| w | 次の単語の先頭へ進む |
| b | 前の単語の先頭へ戻る |
| e | 今の(または次の)単語の末尾へ進む |
| ge | 前の単語の末尾へ戻る |
先頭/末尾×進む/戻るの組み合わせで4種類になります。geだけ見慣れない形ですが、「go end backward」のイメージで覚えると分かりやすいです。
大文字版:記号を無視する4つ
| キー | 動作 |
|---|---|
| W | 次の単語(記号無視)の先頭へ進む |
| B | 前の単語(記号無視)の先頭へ戻る |
| E | 今の(または次の)単語(記号無視)の末尾へ進む |
| gE | 前の単語(記号無視)の末尾へ戻る |
ここが最初の疑問に対する答えになります。小文字のwはvim-config.jsonをvim・-・config・.・jsonのように記号ごとに区切って移動するのに対し、大文字のWは空白でしか区切らず、vim-config.json全体を1つの単語として一気に飛び越えます。
vim-config.json
^ カーソル
vim-config.json
^ カーソル
wを1回押しただけで、記号1文字の-自体が独立した単語として扱われてカーソルが止まります。
アンダースコアだけは例外
-や.のような記号は区切りになりますが、_(アンダースコア)だけは例外でキーワード文字の一部とみなされ、区切りになりません。snake_caseのような命名ではwを押しても止まらず一気に飛び越えます。
| 文字 | 単語の区切りになるか |
|---|---|
_(アンダースコア) | ならない('iskeyword'に含まれる) |
- . ( ) など記号全般 | なる(1文字ごとに単語として区切られる) |
ビジュアルモードでも同じキーが使える
ここまで紹介したキーはすべてビジュアルモードでも同じ意味で動きます。v3wのように選択範囲を単語単位で広げていくこともできるので、単語の切れ目を目で確認しながら選択したいときに便利です。ノーマルモードでオペレータと組み合わせるか、ビジュアルモードで範囲を目視してから操作するかは、状況に応じて使い分けて構いません。
使い分けの目安
| 場面 | 使うキー |
|---|---|
| ハイフンやドット区切りの一部だけを細かく操作したい | 小文字(w/b/e) |
| URLやファイルパスを記号ごと一気に飛ばしたい | 大文字(W/B/E) |
コードを書くときは小文字を多用し、自然文やログの中を大きく移動したいときは大文字に切り替える、という使い分けが実用的です。
_は例外)。大文字は空白だけで区切ります。プログラミング中の細かい移動は小文字、記号混じりの塊をまとめて飛ばしたいときは大文字を使うと動きが直感に合います。
ケバブケースのCSSクラス名を編集しているとき、wだとハイフンの位置でいちいち止まってしまい思ったより移動が細かすぎると感じたことがあります。大文字のWに切り替えたら一気に飛び越えられて、場面によって使い分ける意味がようやく体感できました。逆にスネークケースの変数名はwで止まらず素通りしてしまい、最初は「区切ってくれない」と戸惑ったことも覚えています。今ではコードを書くときは小文字、Markdownやログを読むときは大文字、と無意識に切り替えられるようになりました。
オペレータと組み合わせる
dw " 次の単語の頭まで削除
d3w " 3単語分まとめて削除
cW " 記号込みの単語を変更
単語移動はそれ単体で使うより、dやcのようなオペレータと組み合わせて初めて真価を発揮します。移動の感覚が身についたら、次はオペレータとの組み合わせに慣れていくと上達が早いです。
まとめ
単語移動は記号の扱い方が小文字と大文字で違うだけで、覚える形自体は同じパターンの繰り返しです。1文字単位の移動をあわせて使いたい場合はf/Fによる文字検索移動も参照してください。