2010-02-09 81 views
13

有时我得到了痒的手指,并杀死了一些我想要埋葬的缓冲区。问题是,我使用tramp来编辑多台机器上的文件,这些文件名变得漫长而讨厌,一般来说我并不擅长查找我的文件在哪里。所以我想让emacs跟踪我刚刚关闭的文件,以便我可以轻松地重新打开它们(理想情况下,通过ido提示符)。如何获取emacs中最近关闭的文件列表?

这里是我到目前为止,这是行不通的:

(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,但保持打开的文件的轨道,而不是封闭的文件。]

回答

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) 
+0

它的工作原理。一个新的年度决议,学习lisp的基础是肯定的! – polyglot 2010-02-09 15:56:10

+0

这是非常方便的。我也将它添加到我的.emacs中。谢谢。 – seth 2010-02-10 18:41:06

+0

太棒了!谢谢! – ThePower 2010-02-16 12:52:44

0

有你想过重新绑定“Cx k”来埋葬缓冲区而不是杀死缓冲区? (如果需要,您可以定期清理缓冲区列表,如'midnight.el')。

+0

哦,上帝。事实上,我通常会打开大约50个缓冲区......但总是有另一种方式。 – 2010-02-09 14:39:02

+0

嗯,我重新埋葬缓冲区转移-F4和杀死缓冲区到ctrl-F4,我有时会感到困惑:)但我相当干净的怪胎关于我打开的缓冲区,我害怕恐惧不杀所有我暂时打开的gazillion日志文件进行检查。 – polyglot 2010-02-09 15:58:25

+0

我个人只是让缓冲区关闭,而我恰好使用了OtherMichael为了在必要时重新打开它们而提到的ido/recentf集成。 如果你打开然后迅速关闭文件,正如你所建议的那样,这些日志文件的情况下,那么最近打开的文件和最近关闭的文件之间没有太大的区别。 – sanityinc 2010-02-09 19:52:50

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意识音符。确实,它适用于所有打开的文件,因此它也包含当前处于打开缓冲区的文件。由于我只是在试图追踪最近关闭的文件时才访问过它,因此我从未考虑过这个问题。不过,也许从输出过滤打开的文件可能比重新创建整个轮子更容易?

0

这个美丽的功能也可为“什么”包的一部分。强烈 建议给这个去。

但“什么”有一个名为“掌舵”,似乎并不具备这种功能 较新版本。

相关问题