也是跟 Magit 较上劲了

问题是这样的:

Magit 在工作过程中会产生很多临时性的 buffer,如 magit-diff magit-process,然后就没有其它机制能自动关闭它们。而我又是追求工作环境简洁的人,这我肯定忍不了。于是果断写了一个 hook,目标是在 Magit 的 status 页面按 q 自动释放所有有关 Magit 的 buffer。

(defun my-custom-emacsconfig-ggmagit ()
  "Kill magit related buffer"
  (interactive)
  (let ((magit-buffers (magit-mode-get-buffers)))
    (dolist (buf magit-buffers)
      (when (buffer-live-p buf)
        (kill-buffer buf)))))
(add-hook 'magit-mode-bury-buffer-hook #'my-custom-emacsconfig-ggmagit)

status 页面执行 magit-modde-bury-buffer 却没有效果,但是手动执行 my-custom-emacsconfig-ggmagit 又有效。

折磨了半天之后发现钩子函数执行时,Magit 已经把自己的 buffer 列表 “清空” 了,所以 magit-mode-get-buffers 拿不到任何 buffer,代码相当于白执行。

最后改成

(defun my-custom-emacsconfig-ggmagit (&rest args)
  "Kill magit related buffer before magit escape"
  (let ((magit-buffers (magit-mode-get-buffers)))
    (dolist (buf magit-buffers)
      (when (buffer-live-p buf)
        (kill-buffer buf)))))
(advice-add 'magit-mode-bury-buffer :before #'my-custom-emacsconfig-ggmagit)

成功拿下!

本来已经写好问题了准备发出来求大伙帮忙的,写着写着自己不信邪给改好了,干脆把结果发出来了。万一有谁哪天用得上呢。

3 个赞

很好,我也来试试这个解决方案。

如果是我的话, 我会选择偷doom的 buffers.el中的

(load-file (concat user-emacs-directory "buffers.el"))
(require 'doom-lib)
(push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist)

来避免跳转到那些临时buffers

1 个赞

我一般干完了活 C-x p k 杀掉项目目录所有 buffer

4 个赞

设置 magit-bury-buffer-function 就行,不需要advice。另外,少考虑了git process没结束的情况

1 个赞

仔细阅读了文档之后才发现确实是这样,甚至不需要进行任何设置,连续传递两个 C-umagit-mode-bury-buffer 就能实现了。也就是说其实 C-u C-u q 就能做到的事我愣是写了个额外的函数。早该想到的,作者留下 magit-mode-get-buffers 这样的函数应该就是为了实现这个功能。

OK 兄弟们,看我嗷!我宣布个事!!!!

:clown_face: :clown_face: :clown_face:

1 个赞

是的, 2年前我在Centaur Emacs中也干过同样的事情,发现后也去掉了自己加的函数,没什么意义。magit作者考虑很仔细的。

2 个赞