読者です 読者をやめる 読者になる 読者になる

clever-f.vim を魔改造した話

vim event

Vim Advent Calendar 2012 の 89 日目の記事です。

昨年、clever-f.vim と言うプラグインが rhysd(@) さんからリリースされました。

https://github.com/rhysd/clever-f.vim

どんなプラグインかと言うと、f が便利になるプラグインです。
Vim の f はみなさんご存知ですね。f の次に入力した文字のところまでジャンプする機能です。例えば、fx とするとカーソル位置から次に見付かった x の文字までジャンプできます。l を連打するより速くて便利です。
この機能、便利なんですが、たまに誤爆します。

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
|                                                               ^

今 | にいるんだけど、^ まで行きたい。fi だ!

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
           |                                                    ^

orz

でも大丈夫。もう一度 fi しなくても、f には繰り返し機能があるのです!; を押せばよいです。

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
                                             |                  ^

くッ!まだだッ!もう一度 ; !!

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
                                                                |

無事目的地へ辿り着きました!
こんな感じで、初回は f、それ以降は ; を押していくわけですが、使い分けるのが面倒な人のためのプラグインが clever-f.vim になります。
このプラグインを使うと、2 回目以降の f は繰り返しになります。つまり、

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
|                                                               ^

↓fi

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
           |                                                    ^

↓f

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
                                             |                  ^

↓f

*clever-f.vim* or *clever-f* extends |f| mapping for more convenience.
                                                                |

こんな感じになるわけです。仕組みとしては単純で、カーソル位置が直前に行ったジャンプの位置かどうかを見て繰り返しかどうか判定しています。つまり、カーソルを別の位置へ移動すればまた再び fi とかできるようになります。
また、rbtnn さんの Pull Request で通常の f ではできない別の行へのジャンプもできるようになりました。これ地味に欲しいと思ってた人結構いるのではないでしょうか。



そんなわけで可能性を感じたものの、個人的に機能がまだまだ今一つだったので、魔改造して Pull Request しました。

https://github.com/rhysd/clever-f.vim/pull/2

差分はこんな感じです。

https://github.com/rhysd/clever-f.vim/pull/2/files

ほぼ原型を留めてませんね。これはひどい

ざっと以下のような機能を追加しました。

  • t/T 対応
  • 複数行移動時の omap 時の動作に対応
  • カーソル移動後でも前回の動作を繰り返すキーマッピングを追加((clever-f-repeat-forward)/(clever-f-repeat-back))
  • . による繰り返しに対応
  • [count] に対応
  • F/T を繰り返した時の挙動を変更

かなり機能が増えて便利になったかと思います。
実はまだ解決できていない問題も残っていて、複数行ジャンプが可能であるのと T の機能がバッティングして、T で行末の手前に飛ぼうとすると T じゃなくて F 的な動作になってしまいます。また、. で繰り返しをするとコマンドラインに関数呼び出しの跡が残っちゃいます。
とまあ、問題は残りつつも上記の Pull Request は無事マージされているので、clever-f.vim の最新版で使えます。また、魔改造されたコードも作者の dev ブランチで開発が続けられているようなので一安心です。これらの問題もそのうち直るといいですね!

そんなこんなで明日は ujihisa さんの番です。もう 2 月も終わりですね。