Vimで行頭・行末へ移動する(0/^/$)とインデントの扱い
行頭に移動したつもりが、インデントの空白の前で止まったり、逆に空白を飛び越えてコードの先頭で止まったりします。行頭移動には2種類あり、この違いを知らないと狙った位置に止まりません。
目次(7項目)
| キー | これだけ覚える |
|---|---|
| 0 / ^ | 行頭へ(インデント無視 / 考慮) |
| $ | 行末へ |
| g0 / g^ / g$ | 折り返し単位での移動 |
| I / A | 行頭 / 行末からインサートモードへ |
行頭へ移動する:0 と ^
| キー | 移動先 |
|---|---|
| 0 | 物理的な行の先頭(インデント無視) |
| ^ | 最初の非空白文字(インデント考慮) |
インデントが深いコードで0を使うと空白の一番左まで移動してしまい、そこから改めて右に移動しないとコード本体にたどり着けません。プログラミング中は^のほうが実用的な場面が多くあります。正規表現の行頭を表す^と同じ記号なのは偶然ではなく、意味も対応しています。
行末へ移動する:$
$
こちらは0のような区別がなく、単純に行の末尾(最後の文字)へ移動します。正規表現の行末を表す$とやはり対応しています。
折り返し表示のときは g を前置する
g0 " 折り返し単位での行頭
g^ " 折り返し単位での行頭(インデント考慮)
g$ " 折り返し単位での行末
長い行が画面幅で折り返されて複数行に見えているとき、0/^/$は論理的な1行(実際のテキスト行)の先頭・末尾を対象にします。画面上で折り返された「見た目の行」を対象にしたい場合は、頭にgを付けたバージョンを使います。長文のドキュメントを折り返し表示で読んでいるときに特に差が出ます。
ビジュアルモードでの選択にも使える
これらのキーはビジュアルモードでもそのまま使えます。v$でカーソル位置から行末までを選択、v^でインデント後の行頭までを選択、といった具合です。選択範囲を目で確認しながら操作したい場合は、オペレータと直接組み合わせるよりビジュアルモード経由のほうが安心感があります。
オペレータとの組み合わせ
d$ " カーソルから行末まで削除
d^ " カーソルからインデント後の行頭まで削除(逆方向)
y0 " カーソルから行頭まで(インデント無視)ヤンク
let x = 1; // TODO ^ カーソル
let x = 1;
d$は特によく使う組み合わせです。行の途中から末尾までをまとめて消したいときに重宝します。
最初は0ばかり使っていて、インデントの深いコードのたびに右へ余分に移動していました。^に切り替えてからは、その無駄な移動がまるごと消えました。長いMarkdown文書を折り返し表示で編集するときにg$の存在を知らず、意図しない位置まで飛んで戸惑ったこともあります。今では折り返し表示のファイルを開いた瞬間にg付きのコマンドへ意識を切り替えるようにしています。
挿入モードへのショートカットもある
I " 行頭(インデント考慮)からインサートモードへ
A " 行末からインサートモードへ
IとAは移動だけでなく、そのままインサートモードに入るショートカットです。^iや$aと書く代わりにこの1文字で済むので、行頭・行末から書き始めたいときはこちらのほうが手数が少なくなります。
まとめ
行頭移動は0と^でインデントの扱いが違います。プログラミングでは^、単純な行頭移動なら0、折り返し表示のファイルではg付きを使う、と覚えておくと安心です。行内の移動をさらに詰めたいなら単語単位の移動を、画面やファイル単位の大きな移動はこちらを見てください。行頭・行末の3つは、どれもオペレータの後ろに置いてd0やd$のように削除範囲としても使えます。