Emacs dired 最近開いたディレクトリに一瞬で移動する

Emacs dired 最近開いたディレクトリに一瞬で移動する

autojumpやzというコマンドを最近知りました。

cdを使わずに一瞬で最近開いたディレクトリに移動できるという優れものです。履歴を出して移動するより快適です。

Emacsで同じようなことできないかなと思い適当に書いてみたコードが思いのほか、いい感じです。

使い方

  1. C-x C-d RET
  2. 移動先パスの一部: ema RET
  3. 確認なしに最近開いた /Users/macuser/.emacs.d/ へ移動する

elisp

recentfのリストを一番上からサーチしてマッチした行をdiredで開くだけです。


(require 'recentf)
(recentf-mode t)

(defun open-dired-from-recentf (keyword)
  (interactive "s移動先パスの一部: ")
  (with-temp-buffer
    (insert (format "%s" recentf-list))
    (delete-backward-char 1)
    (goto-char (point-min))
    (delete-char 1)
    (while (re-search-forward "\\s-\/" nil t)
      (replace-match "\n/"))
    (goto-char (point-min))
    (search-forward keyword)
    (dired (file-name-directory (thing-at-point 'line)))
    ))

(global-set-key (kbd "C-x C-d") 'open-dired-from-recentf)

修正

macやlinuxならともかく、windowsのパスでは使えないと思うので修正したのがこちら。mapcar関数を使ってリストの各要素を1行ずつ書き出しています。


(require 'recentf)
(recentf-mode t)

(defun open-dired-from-recentf (keyword)
  (interactive "s移動先パスの一部: ")
  (with-temp-buffer
    (mapcar (lambda (x) (insert (format "%s\n" x)))
            recentf-list)
    (goto-char (point-min))
    (search-forward keyword)
    (dired (file-name-directory (thing-at-point 'line)))
    ))
(global-set-key (kbd "C-x C-d") 'open-dired-from-recentf)

もっと大きなelispを書けるようになりたい。