countを使ってeasymotionとかでfモーションを拡張した時に組込みのfモーションも残す

by
カテゴリ:
タグ:

Vim駅伝2025-10-03の記事です。

マッピングのfは直後に入力した1文字に該当する箇所へ移動します。行内を右側に探索し、;で更に右へ、,で左に移動できます。 Fを使うと移動方向が反対になったり、tTを使うと該当箇所の1文字手前に移動したり、仲間が豊富です。

wなどのモーションに比べて中距離の狙った場所に移動しやすいところが魅力でしょうか。

ところが、;を何回押せば目的の箇所に移動できるかわからない、ASCII文字以外への移動が難しいといった課題があります。

そこで、登場するプラグインがいろいろあります。

たとえば、;を何回押せば目的の箇所に移動できるかわからない問題に対しては、該当文字にabcd…とラベルをふり、ユーザーがラベルを入力した場所へ移動するプラグインがあります。

特にeasymotionはVimmer が紹介する「いぶし銀」なプラグインまとめ(後編)でも紹介された、古くも根強い人気を誇るプラグインです。

ASCII文字以外への移動を可能にするプラグインには私の作ったjab.nvimがあります。

こちらはmigemoという技術を応用して、ローマ字の連想で移動できます。たとえばfaなら「a」だけでなく「あ」や「合」などが候補になるわけですね。ちなみに、easymotionと同じく、移動先はラベルから選びます。

この手のプラグインは便利な一方で、完全にfモーションの類を置き換えてしまうと、たまーに本家の挙動が欲しい……!という事態に遭遇します。

そんな時はカウントを使ってみてはいかがでしょうか。つまり、faだとjab.nvimを使って非ASCII文字にもマッチするが、1faであればASCII文字としての「a」のみにマッチするわけですね。

vim.keymap.set({ "n", "x", "o" }, "f", function()
  if vim.v.count > 0 then
    return "f"
  end
  return require("jab").f()
end, { expr = true })

fモーションは;で移動を繰り返せると紹介しましたが、カウントを使うとn番目のマッチに移動できます。カウントを指定しない場合は1f相当なので、わざわざ使うことは少ないのですが、これを逆手にとるアイデアです。 2以上のカウントも組込みを使っておくと、より自然な体験を得られるでしょう。

同様のテクニックは他のマッピングでも考えられそうですね!

ENJOY!