みなさん、helm使ってますかー?

anything.elhelm.el に改名されてからはや3年になりますが、
今尚anything.elの方がいいと言ってくれる人がいるのは
嬉しい限りです。

anything.elは個人的に使い続けているため、今後とも
最新のEmacsでも動くような状態には保っておきますが
anything.elはもう機能拡張しません。

時代の流れには逆らえないもので、
候補選択フレームワークのトレンドは
anything.elからhelm.elに
完全移行してしまいました。

helm.elは過激に変更しているのでanything.elとは
挙動が変わってしまった点もあります。

特にストレスなのが、バッファ選択です。

M-x helm-mini でバッファを選択するために
クエリを入力しても、変な順番に並んでしまいます。

この原因は、type:bufferの filtered-candidate-transformer
helm-buffers-sort-transformer という関数が入っているからです。

これはバッファの順番をバッファ名の長さにソートする関数です。

type:bufferにて定義されているので、M-x helm-mini以外にも
M-x helm-projectile など、バッファを選択する情報源すべてに影響します。

正直、作者は何考えているのかわかりません(苦笑)。

ハードコーディングされているのでカスタマイズではどうしようもありません。

a_bickyさんも同じストレスを抱えていますが、
彼はパッチとフォークで対処してします。

こちらは本家helmを使いたい人向けです。

検証方法

M-x anything-miniとM-x helm-miniの挙動の違いを確かめるために、
コマンドマルチプレクサmykie.el でC-x C-zに割り当てましょう。

(mykie:global-set-key "C-x C-z"
  :default helm-mini
  :C-u! anything-mini
  :C-u*2 ibuffer)
C-x C-z
helm-mini
C-u C-x C-z
anything-mini
C-u C-u C-x C-z
ibuffer

このようになります。

ibuffer で/ mを使い、メジャーモードでフィルタをかけます(例:org-mode)。

そして、anything-miniとhelm-miniを使って
orgと入力してください。

アドバイスをかける前後で挙動の違いを確認してください。

とっとと潰せ!

こんな関数はアドバイスで潰してしまいましょう。

(defadvice helm-buffers-sort-transformer (around ignore activate)
  (setq ad-return-value (ad-get-arg 0)))

これでbuffer-list順に並ぶようになります。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。