anything-c-dabbrev.elをcodereposにコミットしました

http://svn.coderepos.org/share/lang/elisp/anything-c-dabbrev/anything-c-dabbrev.el

これはなに?

id:rubikitchさん作のanything-dabbrev-expand.el

elispのみでやる感じのanything-sourceです。
anything-dabbrev-expand.elと同じようなことをする(というか結構丸写し)のと、あまり作り込んでいないという理由からアイデアコードみたいな位置づけでお願いします。
一応、面白いコードも部分的にはあります。


実際にdabbrevをanything使ってやりたい人はid:rubikitchさんの書いたanything-dabbrev-expand.elを使うことをお勧めします。

設定サンプル

(require 'anything-c-dabbrev)
(global-set-key (kbd "M-/") 'anything-c-dabbrev-current-buffer)
(define-key anything-c-dabbrev-anything-map (kbd "M-/") 'anything-c-dabbrev-change-all-buffer)

使い方

上のサンプル通りに設定した場合

  • 一回目のM-/で現在のバッファ内の補完対象の文字を含む単語を候補にして起動(部分マッチ)
  • 二回目で全てのバッファを対象にしたdabbrevの補完候補に切り替え

みたいな動作になります。


絞り込みはちょっと新しいアイデアを入れていて、パターンをスペースで区切ると複数の正規表現として扱われ、
各候補に対して全ての正規表現がマッチすると候補に含まれます。
具体的には

after-init-hook

という候補に対して以下のパターンは全てマッチします。

  • after init hook
  • hook$ after init
  • init after hook
  • ^after hook$
  • af ini ho

color-moccurの挙動からヒントを得ました。(確か)
これ、自分的には直感的でよいと思ってます。

絞り込み(match)部分の最適化の話

perl-completion.elとelide.el*1を作っていて思ったことなのですが、候補が大量にあるケース*2はcandidatesをバッファをつかって絞り込みまでやるような作りにして、volatileオプションをつけてcandidatesを毎回組み立てるほうがパフォーマンスが稼ぎやすいみたいです。

その場合matchはいらないので (match . (identity)) とか常にnon-nilを返すようにしてます。


あと、重複削除は

(make-hash-table :test 'equal)

なハッシュを作って突っ込んでから取り出すのがdelete-dups呼ぶより早いような気がします。どうなんだろ。

その他

anything-dabbrev-expand.elがあるのに紛らわしいものだしてごめんなさい。
なんども言いますが anything-dabbrev-expand.elを使うことを推奨します。id:rubikitchさん作です。

anything-c-dabbrev.elは現在の所アイデアコードです。


あれや、dabbrev-expandも置き換わる時代?なんですかね。
(incf rubikitch)

*1:今作ってるemacs lispの補完とかする拡張

*2:dabbrevとか(length cands)が10000を超えるようなケース