anything-multi-occur.elというものを書いてみました。

anything-occurでバッファ中のoccurをanythingで引けるのだけれど、複数のバッファを行き来して作業しているときなどに「どのバッファに書かれているかわからないけれど、どこかのバッファにあるということが分かっている。」というような状況で一度に複数のバッファを検索したくなりました。

少し調べると、multi-occurというコマンドがあったので、これを元にanything-multi-occurを作ることにしました。
ただ、単純に作成すると問題がいくつか生じてしまいました。

問題1 開いている全てのバッファを検索対象にすると処理が重くなる。

単純に(buffer-list)で手に入るバッファのリストを検索対象とすると処理が重くなってしまいました。anything用の情報源なども検索の対象に含まれてしまうみたいです。そこで、検索対象から外すバッファのリストを作成することにしました。*1

問題2 候補が多くなりすぎて選べなくなってしまう場合がある。

たくさんのバッファを開いた状態で"def"などで検索すると候補が6000とかマッチしてしまいます。どれを選べば良いか分からなくなってしまいます。そこで、2段階に操作を分けられるようにしてみました。以下のようにして絞りこむことができます。

例えば、"de"で検索した場合

  • "39 matches for "de" in buffer: experimental.el"のところで選択するとexperimental.elのみを検索対象にします。
  • その他のマッチした行のところで選択した場合には、対応する位置に移動します。

code

今回はgistに置いてあります。 http://gist.github.com/620365

本当はpersistent-actionを自分の手で実行することなく対応行を見たいのだけれど方法がわかりません。

*1:これは正規表現がつかえた方が良いのかどうか考え中