有时候我的手指发痒并且杀死了一些我想埋葬的缓冲液。问题是,我使用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
,但它会跟踪已打开的文件,而不是已关闭的文件。]
答案 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”的新版本似乎没有这个 特征