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

pol*_*lot 13 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)
Run Code Online (Sandbox Code Playgroud)

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

[我知道recentf,但是跟踪打开的文件,而不是关闭的文件.]

kjf*_*tch 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)
Run Code Online (Sandbox Code Playgroud)

更新

我非常喜欢这个功能,并把它放在我的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)))
Run Code Online (Sandbox Code Playgroud)

您的原始问题是cons将返回新列表,而不是操纵输入列表:

(setq mylist '(2 3))
 => (2 3)
(cons 1 mylist)
 => (1 2 3)
mylist
 => (2 3)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要做:

(setq mylist (cons 1 mylist))
  => (1 2 3)
mylist
  => (1 2 3)
Run Code Online (Sandbox Code Playgroud)


Mic*_*nis 5

你尝试过使用recentf吗?它应该与Emacs一起提供.

我最初是通过XSteve的Emacs高级用户提示看到,他建议将它绑定到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))))
Run Code Online (Sandbox Code Playgroud)

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