Emacsのhelm-for-filesのlocate部分でディレクトリパスが表示されなくなったことへの対処
背景
- GNU Emacs 29.4.50(ただしEmacs 30でも同様に再現)
- WSL2 Ubuntu 24.04(ただしGentooでも同様に再現)
- helm
Package-Version: 20250326.719
私はEmacsのhelmを未だに使っています。そして以下のようなカスタム関数を使ってバッファやファイルのほとんどを開いています。
(defun helm-for-files-prefer-recentf ()
"recentfを優先する`helm-for-files'。"
(interactive)
(let ((helm-for-files-preferred-list
'(helm-source-buffers-list
helm-source-recentf
helm-source-ls-git
helm-source-locate)))
(helm-for-files)))
recentfやカレントディレクトリやgitのリポジトリやplocateの結果をまとめてファジーマッチして、簡単にファイルを絞り込んで開くことが出来ます。
それ自体は普通のhelm-for-files
でも出来ることなのですが、私は出来るだけ今開いているバッファや直近で開いたバッファを優先して開けるようにしたいので、ソースを軽くカスタムしています。
非常に便利です。 helmの前身のanythingが登場した時は革命的でした。今ではVSCodeなども追随しているようですし、 Emacsにもhelm以外で似たようなことを実現するパッケージはたくさんあるのですが。
問題
2025年02月あたりから、
helm-for-files
のlocateセクションがおかしくなりました。これまで表示はディレクトリ部分も含めたフルパスで表示されていたのですが、ファイルしか表示されなくなりました。

こうなると例えばcargo.toml
を見たいと思った時にも様々なリポジトリのcargo.toml
の区別がつかなくなってしまうので、どれを開けば良いのか当てずっぽうになってしまいます。
ケアレスミスとかでそのうち治るかなと思っていたのですが、割と長い間続いたので調査します。
調査
直近のGitのコミット履歴を見てもどのコミットが原因だったのかは明確には分かりませんでした。
しかし自作コマンドではなくhelm-locate
コマンドを使うと、正常にディレクトリ部分も含めたフルパスで表示されることが分かりました。
helm-locate
を辿っていくと、
helm-locate
の呼び出し経路では:ff-transformer-show-only-basename
という引数にnil
を渡していることが分かりました。
解決策
なので私もhelm-for-files
を呼び出すのではなくhelm
コマンドを自前で呼び出すようにしました。
(defun helm-for-files-prefer-recentf ()
"recentfを優先する`helm-for-files'。"
(interactive)
(unless helm-source-buffers-list
(setq helm-source-buffers-list
(helm-make-source "Buffers" 'helm-source-buffers)))
(let ((helm-for-files-preferred-list
'(helm-source-buffers-list
helm-source-recentf
helm-source-ls-git
helm-source-locate)))
(helm :sources helm-for-files-preferred-list
:buffer "*helm for files*"
:ff-transformer-show-only-basename nil)))
helm-for-files
内部で(require 'helm-x-files)
をしています。私の使い方ではこのコマンドを動かさずにEmacsを使うことはほぼないので、起動時にこれらをまとめてrequire
してしまいます。
とりあえずはこれで手元では解決です。
報告
よく考えてみると私がカスタムしたことが原因ならともかく、素のhelm-for-files
のlocateのセクションがおかしくなることはhelmのバグの可能性があるので、報告しておくべきでしょう。
報告しました。
どう処理されるかは分かりませんが、バグなら修正されるでしょうし、バグじゃないなら設定がワークアラウンドではなく明確にするべきことになるでしょう。