Vimで1文字検索して移動する(f/F/t/T)と繰り返し(;/,)
同じ行の少し先にあるカンマまで移動したいだけなのに、lを何回も押して1文字ずつ進んでいました。行内の狙った文字へ一発で移動できるコマンドを覚えると、この無駄がなくなります。
| キー | これだけ覚える |
|---|---|
| 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,のように選択範囲をカンマの位置まで一気に広げることができ、そのあとオペレータを続けるかどうかを選べます。ノーマルモードでいきなりオペレータと組み合わせるのが不安なうちは、ビジュアルモードで選択範囲を確認してから操作すると安心です。
まとめ
行内の狙った文字への移動はf/tとその大文字版、そして;/,による繰り返しで完結します。単語単位の移動は別記事を参照してください。