我们如何自动关闭用 * 括起来的临时缓冲区。例如消息,完成缓冲区需要关闭。使用后手动杀死所有这些缓冲区是很痛苦的。
有没有办法关闭由 emacs(不是我们)创建的临时缓冲区?
你真的需要关闭这些缓冲区吗?如果您使用像 iswitchb 这样的适当缓冲区切换方法,那么您不必关心临时缓冲区或其他缓冲区,因为您可以直接转到您想要的任何缓冲区。
我会支持您使用的建议ido
或iswitchb
避免被临时缓冲区打扰。这些缓冲区的存在是使用 emacs 的自然结果,所以不要试图逆流而上!
另一方面,如果您对不断增长的打开缓冲区列表感到恼火,您可以使用midnight.el
它在一段时间后自动关闭不活动的缓冲区,或者您可以使用它ibuffer
来轻松选择和关闭不需要的缓冲区。
就个人而言,我将缓冲区打开很长时间,我偶尔使用 整理它们ibuffer
,我依靠ido
快速切换缓冲区。在 Emacs 24 中,您可以设置ido-use-virtual-buffers
为t
,然后ido
让您切换到已关闭的文件,并根据需要重新打开它们。
为避免这些缓冲区妨碍您,您可以定义键绑定以循环遍历“用户缓冲区”和“无用缓冲区”:
http://ergoemacs.org/emacs/effective_emacs.html,“切换下一个/上一个用户缓冲区”部分
但一些有用的缓冲区以 * 开头,如 shell、编译缓冲区、ielm 等。
正如用户所说,最好使用智能缓冲区切换包,例如iswitchb
and ido
。iswitchb
'siswitchb-buffer-ignore
和ido
'sido-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)))