← Vim研究所

Vimでオペレータ+検索モーションを使う(c/ d/ y/)

2026-08-03 公開

今いる場所から数行先にある特定のキーワードまで、まとめて削除したいことがある。行数を数えてd5jのように指定するより、検索パターンをそのままモーションとして使ったほうが速くて確実だ。

基本の書き方

c/{検索キーワード}<Enter>   " 変更
d/{検索キーワード}<Enter>   " 削除
y/{検索キーワード}<Enter>   " ヤンク

検索コマンド/自体がモーションとして扱われるため、オペレータのあとに検索パターンを続けてEnterを押すだけで、今のカーソル位置から検索でヒットした位置の直前までが操作の対象になる。複数行にまたがっていても関係なく、1コマンドで範囲を指定できる。

1単語ではなく検索パターンだから強力

d3wのような数を数える移動と違い、対象範囲を「次にこの文字列が現れるまで」という条件で指定できるのが最大の利点だ。行数や単語数を数える必要がなく、目的の文字列さえ分かっていれば、そこまでの距離がどれだけ離れていても正確に範囲を指定できる。

d/TODO<Enter>   " 次に「TODO」が現れる直前まで削除

逆方向にも使える

c?{検索キーワード}<Enter>   " 上方向へ検索して変更
d?{検索キーワード}<Enter>   " 上方向へ検索して削除

/の代わりに?を使えば、カーソルより前の方向へ検索してその範囲を対象にできる。前の方に出てくる区切り文字までさかのぼって削除したいときなどに使える。

使いどころ

括弧の中や引用符の中のようにテキストオブジェクトで簡単に範囲指定できる場面では、わざわざこの方法を使う必要はない。真価を発揮するのは、テキストオブジェクトでは指定しにくい「特定のキーワードが現れるまで」というような、構造に頼らない範囲指定をしたいときだ。ログファイルの中で次のエラーメッセージが出るまでの行をまとめて確認したい、といった場面に向いている。

要点:オペレータ+検索は「次にこの文字列が現れるまで」を範囲にできる。行数や単語数を数える手間がなく、テキストオブジェクトでは表現しにくい範囲指定に強い。
使ってみて

長いログの中から次のセクション区切りの文字列までをまとめて削除したい場面で、行数を数えてdを打つよりd/で区切り文字列を指定したほうが圧倒的に速く、しかも数え間違いによる事故もなくなった。慣れると、まず「どこまで操作したいか」を文字列で考える癖がつく。逆方向の?を使い忘れて、遠回りにggから検索し直したこともあるので、両方向あることは意識しておいたほうがよい。今では作業の前に「上に戻るか下に進むか」を一瞬考えてから打つ癖がついている。

まとめ

検索パターンをモーションとして使うオペレータ+検索は、距離や行数を意識せずに範囲指定できる強力な手段だ。cgnによる「検索してすぐ変更」という近い発想のコマンドは別記事で扱っている。

← Vim研究所 トップへ戻る