有时我的手指发痒并杀死一些缓冲剂,我打算埋葬.问题是,我使用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)
你尝试过使用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意识的说明.是的,它适用于所有打开的文件,因此它也包括当前处于打开缓冲区的文件.因为我在尝试追踪最近关闭的文件时只访问过它,所以我从未想过这个.或许,从输出中过滤打开的文件可能比重新发明整个轮子更容易?