auto-complete.elに補完候補を賢くソートしてくれる機能、comphistを実装

最近、auto-complete.elの拡張ばかりでパフォーマンスや安定性を度外視してる感がありますが、今回も凝りずにauto-complete.elの拡張の話をします。お許しを。

auto-complete.elの開発を始めて以来、補完候補の選択の手間を減らせないか、という意見を定期的に頂いています。その時に提案された方法には様々ありましたが、ここで説明するのは面倒くさいので、その基本となるアイデアを要約しますと、補完候補の文字列や補完中の文字列の長さからヒューリスティックを用いて、次に補完されそうな補完候補を先頭にもってくるというものでした。ヒューリスティックを用いるのは全く否定しないのですが、そのヒューリスティック自体の有効性に疑問がありました。そういうわけで、かなり長い間その手の実装を回避していたのですが、未踏でやると公言した手前、やらないわけにはいかないので、実験的に実装してみました。

今回用いた手法はある種のヒューリスティックと言えますが、ある程度統計的手法にも基づいています。詳しいアルゴリズムは説明しませんが*1、補完回数が多いものが上にくる、というのではあまりに簡単すぎなので少し補足します。このアルゴリズムは補完回数をそのまま用いるのではなく、どの場所で補完が実行されたかという統計も同時に採取し、それを利用して補完回数に重み付けを行うことにより、ユーザーの入力習性をうまく学習・利用するようになっています。例えばfiと打ったところでfind-fileを補完することを何回か繰り返せば、以後はfiと打った時点でfind-fileが補完候補の先頭になります。ただ、find-と打ったときにもfind-fileが先頭に来るかと言えばそういう訳でもなく、この場合ではfiの時より距離として3離れているわけですから、その分重み付けが軽くなります。結果的にfind-の後にfind-libraryを補完するようなユーザーの入力習性をうまく捕むことができるのです。

とまあ、このあたりは完全な仮定に基づいた理論でしかないので、実際の有効性を調べるには皆さんのお力を拝借しなければなりません。もし、この機能の有効性を調べてくれる方がいらっしゃいましたら、githubのHEADからソースコードをpullしてインストールしてください。色々な拡張・習性によりパフォーマンスや安定性に問題があると思いますが、実作業環境で利用していただけるほうが、意味のあるデータを採取できるはずです。フィードバックはこのブログのコメントかTwitter(@m2ym)までよろしくおねがいします。

なお、この機能はまだ実験中なのでac-use-comphistをtにしないと利用できません。その際、一度M-x auto-complete-modeでauto-complete-modeをoffにしてから再度onにしてご利用ください。

*1:説明するまでもないアルゴリズム、とも言えますが