Vimで1文字検索して移動する(f/F/t/T)と繰り返し(;/,)
同じ行の少し先にあるカンマまで移動したいだけなのに、lを何回も押して1文字ずつ進んでいました。行内の狙った文字へ一発で移動できるコマンドを覚えると、この無駄がなくなります。
目次(11項目)
| キー | これだけ覚える |
|---|---|
| f{文字} | 右へ検索、その文字の上に乗る |
| t{文字} | 右へ検索、その文字の手前で止まる |
| F / T | 左方向版 |
| ; / , | 直前の検索を同方向 / 逆方向に繰り返す |
指定した文字へ移動する:f/F
f{文字} " 右方向、その文字の上にカーソルが乗る
F{文字} " 左方向、その文字の上にカーソルが乗る
fは「Find」の頭文字と覚えておくと分かりやすいです。同じ行に対象の文字が複数ある場合は、繰り返し実行するか、{数字}f{文字}のように何番目かを指定します。
手前で止まる:t/T
t{文字} " 右方向、その文字の手前で止まる
T{文字} " 左方向、その文字の手前で止まる
t(till)はfとほぼ同じですが、対象の文字の1つ手前で止まる点が違います。dt,(カンマの手前まで削除)のようにオペレータと組み合わせたとき、区切り文字自体を残したいか消したいかでfとtを使い分けると意図通りの結果になります。
繰り返す:;/,
; " 直前のf/F/t/Tと同じ方向へ繰り返す
, " 直前のf/F/t/Tと逆方向へ繰り返す
一度f,のように検索してしまえば、あとは;を押すだけで次の同じ文字へ次々と移動できます。同じ行の中で同じ記号が何度も出てくるコードを編集するとき、この繰り返しを使うと移動の手数が大きく減ります。
行をまたいでは移動しない
f/F/t/Tはいずれも「今の行の中」だけを検索対象にします。次の行に同じ文字があっても、そこへは移動しません。複数行にまたがって同じ文字を探したいなら、通常の検索コマンド/を使う必要があります。行内の細かい移動にはf系、行をまたぐ検索には/、と役割が違う点を押さえておくと迷いません。
オペレータと組み合わせる
one,two,threeのカンマ区切りで、先頭にカーソルを置いてdf,とdt,を比べると差がはっきり分かります。
one,two,three ^ カーソル
two,three
one,two,three ^ カーソル
,two,three
df,はカンマ自体も含めて4文字消えますが、dt,はカンマの手前の3文字だけが消えてカンマは残ります。区切り文字を残すか消すかを毎回考えずに一発で決められるようになります。
CSVのような区切り文字の多いテキストを編集する機会が多く、f,と;の組み合わせを覚えてからは、カンマからカンマへ飛び移る作業が体感で倍近く速くなりました。tとfの違いも、削除系のオペレータと組み合わせて初めて実感として理解できました。逆方向への繰り返し,の存在を忘れがちで、行き過ぎてから;を連打し直すことも今でもたまにあります。
ビジュアルモードでも使える
ここまでのキーはビジュアルモードでも同じ意味で動きます。vf,のように選択範囲をカンマの位置まで一気に広げることができ、そのあとオペレータを続けるかどうかを選べます。ノーマルモードでいきなりオペレータと組み合わせるのが不安なうちは、ビジュアルモードで選択範囲を確認してから操作すると安心です。
t を打ち直しても進まない
t で目的の文字の手前まで来た状態から、もう一度同じ t を打ってもカーソルは動きません。すでに「その文字の直前」という条件を満たしているためです。次へ進みたいときは ; を使います。
この違いは cpoptions の ; というフラグが決めていて、既定では含まれていないため ; は手前で止まらず次まで飛びます。t を連打しても進まない、という引っかかり方をしたときはこれが理由です。
:set cpoptions? " 既定は aABceFs(; は含まれない)
数を付けて何個目かを指定する
3f, と打つと、3つ目のカンマまで一気に飛びます。オペレータと組み合わせれば d3f, で3つ目のカンマまで消えます。
ただし正確に数えられるのは、目で見て3つ目だと分かるときだけです。それ以上になると数えるほうに時間がかかるので、; を連打したほうが速く済みます。; なら行き過ぎても , で戻れるので、迷ったらこちらが確実です。
目印にする文字の選び方
f が効くかどうかは、狙う文字の選び方でほぼ決まります。カッコ・クォート・カンマ・セミコロン・等号のように行の中で数が少ない記号を選べば、1回で目的地に着きます。
逆に e や a のような頻出する文字を目印にすると、; を何度も押すことになって手数が増えます。行を見て「この行でいちばん珍しい文字はどれか」を探す感覚が身につくと、移動が一段速くなります。行をまたいで飛びたいときは検索モーションのほうが向きます。
まとめ
行内の狙った文字への移動はf/tとその大文字版、そして;/,による繰り返しで完結します。単語単位の移動は別記事を参照してください。;は同じfやtを繰り返すだけですが、直前の編集そのものを繰り返したいときは.(ドットコマンド)のほうが向いています。
ここで扱ったキーは、ブラウザ上で動くVim道場の行の中の文字を狙って飛ぶでそのまま試せます。インストールもログインも要りません。