如何获取emacs中最后关闭的文件列表?

时间:2010-02-09 07:16:50

标签: emacs elisp

有时候我的手指发痒并且杀死了一些我想埋葬的缓冲液。问题是,我使用tramp来编辑来自多台机器的文件,而且这些文件名变得冗长而令人讨厌,而且总的来说,我并不擅长找到我的文件的位置。所以我想让emacs跟踪我刚刚关闭的文件,以便我可以轻松地重新打开它们(通过理想情况下,通过ido提示)。

这是我到目前为止所做的,但是没有效果:

(defvar closed-files '())

(defun track-closed-file ()
  (message buffer-file-name)
  (and buffer-file-name
       (cons  buffer-file-name closed-files)))

(defun last-closed-files ()
  (interactive)
  (find-file (ido-completing-read "Last closed: " closed-files)))

(add-hook 'kill-buffer-hook 'track-closed-file)

我真的不擅长elisp,可能会在定义变量和添加单元格时陷入困境......

[我确实知道recentf,但它会跟踪已打开的文件,而不是已关闭的文件。]

5 个答案:

答案 0 :(得分:16)

我刚刚对此进行了测试,它可以使用列表和add-to-list这也可以消除重复的条目。这符合您的需求吗?

(defvar closed-files (list))

(defun track-closed-file ()
  (message buffer-file-name)
  (and buffer-file-name
       (add-to-list 'closed-files buffer-file-name)))

(defun last-closed-files ()
  (interactive)
  (find-file (ido-completing-read "Last closed: " closed-files)))

(add-hook 'kill-buffer-hook 'track-closed-file)

更新

我非常喜欢这个功能并将其放在我的emacs配置中。您也可以从我所做的改变中受益。

此添加会将最近关闭的文件推送到列表的头部,即使它们之前已被关闭(并且已经在closed-files列表中)。

(defun track-closed-file ()
  (and buffer-file-name
       (message buffer-file-name)
       (or (delete buffer-file-name closed-files) t)
       (add-to-list 'closed-files buffer-file-name)))

你原来的问题是cons会返回新列表,而不是操纵输入列表:

(setq mylist '(2 3))
 => (2 3)
(cons 1 mylist)
 => (1 2 3)
mylist
 => (2 3)

在这种情况下你需要做:

(setq mylist (cons 1 mylist))
  => (1 2 3)
mylist
  => (1 2 3)

答案 1 :(得分:5)

您是否尝试过使用recentf?它应该与Emacs一起提供。

我最初是通过XSteve's Emacs power-user tips看到的,他建议将其绑定到F12,并提供交互式界面:

;;recentf
(require 'recentf)
(recentf-mode 1)
(setq recentf-max-saved-items 500)
(setq recentf-max-menu-items 60)
(global-set-key [(meta f12)] 'recentf-open-files)

(defun xsteve-ido-choose-from-recentf ()
  "Use ido to select a recently opened file from the `recentf-list'"
  (interactive)
  (let ((home (expand-file-name (getenv "HOME"))))
    (find-file
     (ido-completing-read "Recentf open: "
                          (mapcar (lambda (path)
                                    (replace-regexp-in-string home "~" path))
                                  recentf-list)
                          nil t))))

[更新]:whups,刚刚看到你关于recentf意识的说明。是的,它适用于所有打开的文件,因此它也包括当前处于打开缓冲区的文件。因为我在尝试追踪最近关闭的文件时只访问过它,所以我从未想过这个。或许,从输出中过滤打开的文件可能比重新发明整个轮子更容易吗?

答案 2 :(得分:1)

答案 3 :(得分:0)

您是否考虑过将“C-x k”重新绑定到bury-buffer而不是kill-buffer? (如果需要,您可以定期用'midnight.el'清理缓冲区列表。)

答案 4 :(得分:0)

这个美丽的功能也可以作为“任何”包的一部分。非常 建议放手一搏。

但“任何东西”都有一个名为“helm”的新版本似乎没有这个 特征