• 作成:

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セクションがおかしくなりました。これまで表示はディレクトリ部分も含めたフルパスで表示されていたのですが、ファイルしか表示されなくなりました。

emacs-helm.shでhelm-for-filesを起動して検索するとディレクトリ名が表示されていない

こうなると例えば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のバグの可能性があるので、報告しておくべきでしょう。

報告しました。

helm-source-locate in helm-for-files shows only basenames instead of full paths · Issue #2713 · emacs-helm/helm

どう処理されるかは分かりませんが、バグなら修正されるでしょうし、バグじゃないなら設定がワークアラウンドではなく明確にするべきことになるでしょう。