在Emacs中,如何维护最近目录的列表?

时间:2014-04-27 19:34:22

标签: emacs elisp dired recent-file-list

在Emacs中,我广泛使用recentf。我通常调用自定义函数xsteve-ido-choose-from-recentf而不是调用find-files,而是允许我从recentf文件中进行选择。

如何创建和维护最近目录的单独列表,与最近的文件列表分开?那么我可以调用类似dired的内容而不是调用ido-choose-from-recent-directories而不是调用{{1}}吗?

3 个答案:

答案 0 :(得分:3)

您不需要维护单独的列表(这将是很多工作)。相反,您可以从recentf列表中提取该列表。 E.g。

(delete-dups
 (mapcar (lambda (file)
           (if (file-directory-p file) file (file-name-directory file)))
         recentf-list))

答案 1 :(得分:3)

你在评论中回答@Stefan的回答:我如何从上面看到查看最近目录的列表? -

答案是你使用鲜为人知的事实,如果DIRNAME的{​​{1}}参数是(a)新的Dired缓冲区名称后跟(b)文件(或目录)的列表)名称,然后Dired打开只为那些文件/目录。 IOW:

dired

例如:

M-: (dired (cons DIRED-BUFNAME YOUR-LIST-OF-RECENT-DIRECTORIES))

如果您使用库Dired+,则可以使用带有M-: (dired '("My Dired Buffer" "/a/recent/dir/" "/another/recent1/" "/another/")) 的非正前缀arg以交互方式提供此类列表。

但是在这种情况下,你想编写一个命令,首先收集最近目录的列表,然后为它们打开Dired。这应该这样做:

dired

这对我有用。但是,vanilla Emacs不允许您使用(defun dired-recent (buffer) "Open Dired in BUFFER, showing the recently used directories." (interactive "BDired buffer name: ") (let ((dirs (delete-dups (mapcar (lambda (f/d) (if (file-directory-p f/d) f/d (file-name-directory f/d))) recentf-list)))) (dired (cons (generate-new-buffer-name buffer) dirs)))) 插入与Dired缓冲区的i不在同一目录树中的任何目录的列表。这意味着上面的代码可以正常工作,但您将无法插入任何列出的目录。

为了能够这样做,请加载库dired+.elDired+还解决了香草处理default-directory的一些其他不足之处。

以上代码与 Dired + 一起应该可以满足您的需求。


<强> 更新

我刚刚将其添加到Dired+。这些是添加的命令:direddiredp-dired-recent-dirs


更新2

我简单地选择要包含或排除哪些最近使用的目录。使用前缀arg启动此类选择。没有前缀arg你得到所有最近的dirs。我还可以使用前缀arg来提示diredp-dired-recent-dirs-other-window个开关。以下是ls

的文档
diredp-dired-recent-dirs

最后,我添加了命令的绑定:Open Dired in BUFFER, showing recently used directories. You are prompted for BUFFER. No prefix arg or a plain prefix arg (`C-u', `C-u C-u', etc.) means list all of the recently used directories. With a prefix arg: * If 0, `-', or plain (`C-u') then you are prompted for the `ls' switches to use. * If not plain (`C-u') then: * If >= 0 then the directories to include are read, one by one. * If < 0 then the directories to exclude are read, one by one. When entering directories to include or exclude, use `C-g' to end. (同一窗口)和C-x R(其他窗口),其中C-x 4 R是Shift + R

答案 2 :(得分:2)

Pragmatic Emacs找到了解决方案。

  

这是一个使用常春藤为您提供最近目录列表的功能   (swiper的一部分)动态缩小它,然后打开选中的   一个人直截了当。

;; open recent directory, requires ivy (part of swiper)
;; borrows from http://stackoverflow.com/questions/23328037/in-emacs-how-to-maintain-a-list-of-recent-directories
(defun bjm/ivy-dired-recent-dirs ()
  "Present a list of recently used directories and open the selected one in dired"
  (interactive)
  (let ((recent-dirs
         (delete-dups
          (mapcar (lambda (file)
                    (if (file-directory-p file) file (file-name-directory file)))
                  recentf-list))))

    (let ((dir (ivy-read "Directory: "
                         recent-dirs
                         :re-builder #'ivy--regex
                         :sort nil
                         :initial-input nil)))
      (dired dir))))

(global-set-key (kbd "C-x C-d") 'bjm/ivy-dired-recent-dirs)

来源: Open a recent directory in dired: revisited | Pragmatic Emacs