我们如何自动关闭用 * 包围的临时缓冲区。例如,需要关闭 messages 和 completions 缓冲区。手动逐一杀死这些缓冲区非常繁琐。
有没有一种方法可以关闭由 Emacs(而不是我们)创建的临时缓冲区?
有没有一种方法可以关闭由 Emacs(而不是我们)创建的临时缓冲区?
我建议你使用ido
或iswitchb
来避免被临时缓冲区所打扰。这些缓冲区的存在是使用emacs的自然结果,所以不要试图逆流而上!
另一方面,如果你对打开的缓冲区列表越来越长感到烦恼,你可以使用midnight.el
来在一段时间后自动关闭不活跃的缓冲区,或者使用ibuffer
来轻松选择和批量关闭不需要的缓冲区。
个人而言,我会长时间保留缓冲区,偶尔使用ibuffer
整理它们,并依赖ido
快速切换缓冲区。在Emacs 24中,你可以将ido-use-virtual-buffers
设置为t
,然后ido
将允许你切换到关闭的文件,并在必要时重新打开它们。
iswitchb
和ido
。 iswitchb
的iswitchb-buffer-ignore
和ido
的ido-ignore-buffers
变量允许我们使用正则表达式指定要忽略的缓冲区。(require 'cl)
(defvar kill-star-buffers-except
'("\\`\\*scratch\\*\\'"
"\\`\\*Messages\\*\\'"
"\\` \\*Minibuf-[[:digit:]]+\\*\\'"
"\\` \\*Echo Area [[:digit:]]+\\*\\'")
"Exception list for `kill-star-buffers'")
(defun kill-star-buffers ()
"Kill all star buffers except those in `kill-star-buffers-except'"
(interactive)
(mapc (lambda (buf)
(let ((buf-name (buffer-name buf)))
(when (and
;; if a buffer's name is enclosed by * with optional leading
;; space characters
(string-match-p "\\` *\\*.*\\*\\'" buf-name)
;; and the buffer is not associated with a process
;; (suggested by "sanityinc")
(null (get-buffer-process buf))
;; and the buffer's name is not in `kill-star-buffers-except'
(notany (lambda (except) (string-match-p except buf-name))
kill-star-buffers-except))
(kill-buffer buf))))
(buffer-list)))
(get-buffer-process)
的非零值的缓冲区,例如编译或repl缓冲区。 - sanityinc
*Messages*
和*Minibuffer*
是毫无意义的,而且在某些情况下可能是危险的。你为什么要关心这些用于内部使用的缓冲区呢?在大多数情况下,你不应该关心它们。 - tripleee