安利一个小功能, 重新打开上次关闭的文件

(defvar vmacs-killed-file-list nil
  "List of recently killed files.")

(defun vmacs-add-to-killed-file-list ()
  "If buffer is associated with a file name, add that file to the
`vmacs-killed-file-list' when killing the buffer."
  (when buffer-file-name
    (unless (or (string-match-p "COMMIT_EDITMSG" buffer-file-name)
                (string-match-p "/cache/recentf" buffer-file-name))
      (push buffer-file-name vmacs-killed-file-list))))

(add-hook 'kill-buffer-hook #'vmacs-add-to-killed-file-list)

(defun vmacs-undo-kill-buffer ()
  "Reopen the most recently killed file, if one exists."
  (interactive)
  (when vmacs-killed-file-list
    (message "reopen file: %s" (find-file (pop vmacs-killed-file-list)))))
1 个赞

如果用 recentf-mode 的话:

(defun my-reopen-closed-file ()
  (interactive)
  (find-file (car recentf-list)))

这先试了recentf这种方法, 但是有问题,比如我先打开a ,后打开b, 我再切换到a 把a kill掉,用你这种方法,打开的应该是b

1 个赞

删除文件的时候.运行hook,更新recentf的数据库不就可以了

我的观念是: 能依赖emacs内置的工具,尽量不要自己造轮子

确实有这个问题。用下面的方法或许可以解决这个问题,但是这个文件的顺序对 Recentf Mode 自身或许也有意义,Open File History 跟 Last Closed File 逻辑似乎有不同,不用 Recenf Mode 也挺好。

(add-hook 'kill-buffer-hook #'recentf-track-opened-file)

我自己还尝试过实现“重现打开上次关闭的 Buffer”,但这个功能看似简单,但实现起来却复杂,我还没写完就失去了兴趣。把对象限制在文件上面会让问题变得简单,实现起来也比较容易,应该也更有实用价值。

需求越简单,实现越容易,方案越实用。

只知道desktop-file的路过

你有没有在melpa里面找,看有没有类似的包,如果没有,恭喜你,这就是你的包了

似乎和 escreen 是类似的。

不了解。这个功能我最早是从 Chrome 上的 “Reopen Closed Tab” 了解到的,其它的地方也有类似的。

感觉是个挺有用的小功能,我已经加到自己的配置里了

spacemacs 里“打开最近关闭的 buffer”的默认绑定是SPCbu

2 个赞

这个功能在李杀的 xah-fly-keys 里面有一些对应的实现。对实他的两个函数:

xah-close-current-buffer
xah-open-last-closed
xah-open-recently-closed
...

我是直接拿过来用了