helmで最近開いたディレクトリを開く

るびきちさんの recentf-ext.elを使ってみたら、ファイル名だけでなくディレクトリも表示されるのが予想外に便利でした。 そのうちに、最近開いたディレクトリの一覧だけをhelmで表示できたら、peco でやっているみたいにディレクトリ移動ができて便利じゃないかと思い始めました。

そこで、helmを使って最近開いたディレクトリを開くを参考にinit.elにコードを追加したのですが、ディレクトリの一覧は表示されるものの、なぜかディレクトリを移動できません。

いろいろ調べた結果、現在のhelmでは (type . file) を指定してもうまく動いてくれないようです。(action . dired)にすればdired-modeになりますが、helm-recentf が持っている Delete file(s) from recentf が使えなくなってしまいます。

recentf-auto-cleanup を使うことも考えましたが、設定を 'never にしておかないと、外付けのHDDなどの情報が消えてしまい、これもちょっと不便です。今の私の使い方だと、自分の任意のタイミングで履歴から削除できた方が便利です。

emacs lisp は全然分かっていませんが、試行錯誤の結果、以下のコードでようやく目的を達成することができました。

;;helm recentf only directories
(defclass helm-recentf-directory-source (helm-recentf-source helm-source-sync helm-type-file)
  ((candidates :initform (lambda ()
                           (loop for file in recentf-list
                                 when (file-directory-p file)
                                 collect file)))))

(setq helm-recentf-directory-source
      (helm-make-source "Recentf" 'helm-recentf-directory-source
        :fuzzy-match t))

(defun helm-recentf-directory ()
  "Preconfigured `helm' for `recentf'."
  (interactive)
  (helm :sources 'helm-recentf-directory-source
        :ff-transformer-show-only-basename nil
        :buffer "*helm recentf*"))

同じような目的で使いたい方がいるかもと思いましたので、ブログにあげてみました。