← Vim研究所

Vimの検索オフセットで、検索後のカーソル位置を指定する

2020-01-26 公開 ・ 更新: 2026-08-20

検索してマッチした文字列の末尾にカーソルを移動させたいのに、毎回/wordのあとにelを何度も押して調整していた時期があります。検索コマンド自体に「マッチ位置からどれだけずらすか」を直接指定できる仕組みがあります。

目次(9項目)

基本の書き方

/{検索キーワード}/{オフセット}<Enter>
?{検索キーワード}?{オフセット}<Enter>

検索キーワードのあとにもう一度区切り文字(/または?)を挟んでオフセットを書きます。上方向検索の?を使う場合は、オフセット側の区切りも?にする必要がある点は間違えやすいので注意してください。

よく使うオフセット

オフセット移動先
eマッチした文字列の末尾
e+N / e-N末尾からN文字右/左
s+N / s-N先頭からN文字右/左(bでも同じ)
N / +Nマッチした行からN行下
-Nマッチした行からN行上

もっとも使う場面が多いのはeです。マッチした単語の末尾に一発で移動できるので、そこからaで追記したり、次の操作につなげたりしやすくなります。

BEFORE
function foo() {}
/foo/e
AFTER
function foo() {}

行頭にあったカーソルが、マッチしたfooの末尾(最後のo)まで一気に移動します。aで続けて入力すれば、そのまま単語の直後に追記できます。

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

検索オフセットは移動先の指定なので、オペレータと組み合わせるとその区間がまとめて操作対象になります。マッチした部分を書き換える定番パターンが次の形です。

/foo<CR>
c//e<CR>bar<Esc>

最初にfooを検索し、c//e(直前の検索パターンをそのままオフセットe付きで再利用して変更)でbarに書き換えます。//は直前の検索パターンを再利用する記法で、同じ単語を続けて書き換えたいときに毎回パターンを打ち直さずに済みます。

単に移動したいだけなら n/N でも足りる

すでに検索済みのパターンをオフセット付きで再検索したいだけなら、n(次のマッチへ)やN(前のマッチへ)でも移動はできます。ただしn/Nは元の検索時に指定したオフセットを引き継がないため、末尾ぴったりに止めたいといった細かい位置指定をしたい場合は、そのつどオフセット付きで検索し直す必要があります。移動先の精度にこだわらないならn/N、正確な位置に止めたいならオフセット、と使い分けると便利です。

要点:オフセットは「検索してから移動する」を1コマンドにまとめる仕組みです。単体でも便利ですが、c//eのようにオペレータと組み合わせると効果が跳ね上がります。
使ってみて

最初はeオフセットだけ覚えて満足していましたが、同じ単語を複数箇所で書き換える作業をしていたときにc//eの連打パターンを知ってから作業速度が変わりました。検索して、書き換えて、nで次へ、またc//eという流れが手に馴染むと、置換コマンドを使う場面がかなり減りました。行オフセットの+N/-Nは当初あまり使わないだろうと思っていましたが、ログファイルで特定のキーワードの数行下にある値だけ確認したいときに地味に重宝しています。

行単位のオフセット

数字だけを書くと、マッチした行から何行ずらすかの指定になります。設定ファイルの見出しを探して、その次の行から編集を始めたいときに使えます。

/section/+1<Enter>    " 見つかった行の1行下へ
/section/-2<Enter>    " 2行上へ
/section/+<Enter>     " 1行下へ(数字は省略できる)

行単位のオフセットを付けると、オペレータと組み合わせたときの範囲も行単位になります。d/section/+1 は行ごと消えるので、文字単位で消したいときは es のオフセットを使ってください。

n で繰り返すとオフセットも付いてくる

オフセット付きで検索したあと n を押すと、オフセットも一緒に繰り返されます。/foo/e で語の末尾に飛んだあと n を押せば、次の foo でも末尾に止まります。

オフセットを外したいときは、// と打って空の検索を実行します。パターンは直前のものが使われ、オフセットだけがリセットされます。

//<Enter>      " 同じパターンをオフセット無しで検索

s と b は同じ意味

オフセットには e(末尾)のほかに s(先頭)と b(先頭)があり、この2つは同じ意味です。s は start、b は begin の頭文字で、どちらを書いても結果は変わりません。

単独で使うとマッチの先頭に止まるだけなので、既定の動きと同じです。意味が出るのは数字を足したときで、/foo/s+2 なら先頭から2文字進んだ位置、/foo/e-1 なら末尾から1文字戻った位置になります。囲み文字の内側だけを狙いたいときに使えます。検索の基本とあわせて覚えると、移動の精度が上がります。

まとめ

検索オフセットは地味ですが、マッチ位置からの移動を1コマンドに圧縮できます。特にeオフセットとオペレータの組み合わせは覚えておく価値が高いです。

関連記事

← Vim研究所 トップへ戻る