← Vim研究所

Vimで行頭・行末へ移動する(0/^/$)とインデントの扱い

2019-05-10 公開 ・ 更新: 2026-08-23

行頭に移動したつもりが、インデントの空白の前で止まったり、逆に空白を飛び越えてコードの先頭で止まったりします。行頭移動には2種類あり、この違いを知らないと狙った位置に止まりません。この記事は1行の中の移動を扱います。単語・画面・ファイル単位まで含めた全体像はカーソル移動まとめのほうにあります。1画面ぶんのページ送り(Ctrl-fCtrl-b)を探している場合は画面スクロールとジャンプ操作が担当です。

目次(11項目)
キーこれだけ覚える
0 / ^行頭へ(インデント無視 / 考慮)
$行末へ
g0 / g^ / g$折り返し単位での移動
I / A行頭 / 行末からインサートモードへ

行頭へ移動する:0 と ^

キー移動先
0物理的な行の先頭(インデント無視)
^最初の非空白文字(インデント考慮)

インデントが深いコードで0を使うと空白の一番左まで移動してしまい、そこから改めて右に移動しないとコード本体にたどり着けません。プログラミング中は^のほうが実用的な場面が多くあります。正規表現の行頭を表す^と同じ記号なのは偶然ではなく、意味も対応しています。

行末(行の末尾)へ移動する:$

$

こちらは0のような区別がなく、単純に行の末尾(最後の文字)へ移動します。正規表現の行末を表す$とやはり対応しています。

ここで扱う「末尾」は1行の中の末尾です。ファイルの最後の行に移動したい場合はG、最終行の行末まで飛ぶならG$になります。ファイル単位の移動は画面スクロールとジャンプ操作のほうにまとめています。

折り返し表示のときは g を前置する

g0   " 折り返し単位での行頭
g^   " 折り返し単位での行頭(インデント考慮)
g$   " 折り返し単位での行末

長い行が画面幅で折り返されて複数行に見えているとき、0/^/$は論理的な1行(実際のテキスト行)の先頭・末尾を対象にします。画面上で折り返された「見た目の行」を対象にしたい場合は、頭にgを付けたバージョンを使います。長文のドキュメントを折り返し表示で読んでいるときに特に差が出ます。

ビジュアルモードでの選択にも使える

これらのキーはビジュアルモードでもそのまま使えます。v$でカーソル位置から行末までを選択、v^でインデント後の行頭までを選択、といった具合です。選択範囲を目で確認しながら操作したい場合は、オペレータと直接組み合わせるよりビジュアルモード経由のほうが安心感があります。

オペレータとの組み合わせ

d$   " カーソルから行末まで削除
d^   " カーソルからインデント後の行頭まで削除(逆方向)
y0   " カーソルから行頭まで(インデント無視)ヤンク
BEFORE
let x = 1; // TODO
          ^ カーソル
d$
AFTER
let x = 1;

d$は特によく使う組み合わせです。行の途中から末尾までをまとめて消したいときに重宝します。

要点:プログラミング中の行頭移動は^を基本にすると無駄がありません。折り返し表示のファイルではg付きのバージョンを思い出すと便利です。
使ってみて

最初は0ばかり使っていて、インデントの深いコードのたびに右へ余分に移動していました。^に切り替えてからは、その無駄な移動がまるごと消えました。長いMarkdown文書を折り返し表示で編集するときにg$の存在を知らず、意図しない位置まで飛んで戸惑ったこともあります。今では折り返し表示のファイルを開いた瞬間にg付きのコマンドへ意識を切り替えるようにしています。

挿入モードへのショートカットもある

I   " 行頭(インデント考慮)からインサートモードへ
A   " 行末からインサートモードへ

IAは移動だけでなく、そのままインサートモードに入るショートカットです。^i$aと書く代わりにこの1文字で済むので、行頭・行末から書き始めたいときはこちらのほうが手数が少なくなります。

$ と g_ の違い

$ が止まるのは行の最後の文字で、そこが空白でも空白の上に止まります。末尾の空白を除いた最後の文字へ行きたいときは g_ を使います。

手元のVim 9.1.1752で foo bar の後ろに空白を3つ置いた行を試すと、$ は10桁目(最後の空白)、g_ は7桁目(r の上)で止まりました。

foo bar___        " _ は空白
$                 " 10桁目(最後の空白の上)
g_                " 7桁目(r の上)

行末の空白を消したいときは d$ ではなく dg_ だと逆に空白が残るので、この場面では $ のほうが向きます。逆に、末尾の文字だけを書き換えたいときは g_ のほうが確実です。

$ は「行末」という状態を覚える

$ を押したあとに j で下の行へ移ると、行の長さが違ってもカーソルは行末に留まります。桁の数字ではなく「行末にいる」という状態を覚えているためで、長さの違う行が並んでいても末尾をたどっていけます。

この状態は hl で横に動かした時点で解除されます。行末をたどっているつもりが途中から桁が固定される、と感じたときは、間に横移動が入っていないかを確かめてください。

ビジュアルモードでの $ は改行を含まない

v$ で選ぶ範囲は行の最後の文字までで、改行は含みません。そのため v$d で消しても行そのものは残り、空行になります。行ごと消したいときは V で行単位に選ぶか dd を使います。

矩形選択のときだけは $ の意味が変わり、長さの違う行それぞれの末尾まで範囲が伸びます。行末にまとめて文字を足すときは、Ctrl-v で行を選んでから $ を押し、A で入力するという手順になります。

まとめ

行頭移動は0^でインデントの扱いが違います。プログラミングでは^、単純な行頭移動なら0、折り返し表示のファイルではg付きを使う、と覚えておくと安心です。行内の移動をさらに詰めたいなら単語単位の移動を、画面やファイル単位の大きな移動はスクロールとジャンプ操作を見てください。行頭・行末の3つは、どれもオペレータの後ろに置いてd0d$のように削除範囲としても使えます。

ここで扱ったキーは、ブラウザ上で動くVim道場の行の端とファイルの端へ飛ぶでそのまま試せます。インストールもログインも要りません。

関連記事

← Vim研究所 トップへ戻る