3

我们如何自动关闭用 * 括起来的临时缓冲区。例如消息完成缓冲区需要关闭。使用后手动杀死所有这些缓冲区是很痛苦的。

有没有办法关闭由 emacs(不是我们)创建的临时缓冲区?

4

4 回答 4

5

你真的需要关闭这些缓冲区吗?如果您使用像 iswitchb 这样的适当缓冲区切换方法,那么您不必关心临时缓冲区或其他缓冲区,因为您可以直接转到您想要的任何缓冲区。

于 2012-08-11T12:40:32.233 回答
3

我会支持您使用的建议idoiswitchb避免被临时缓冲区打扰。这些缓冲区的存在是使用 emacs 的自然结果,所以不要试图逆流而上!

另一方面,如果您对不断增长的打开缓冲区列表感到恼火,您可以使用midnight.el它在一段时间后自动关闭不活动的缓冲区,或者您可以使用它ibuffer来轻松选择和关闭不需要的缓冲区。

就个人而言,我将缓冲区打开很长时间,我偶尔使用 整理它们ibuffer,我依靠ido快速切换缓冲区。在 Emacs 24 中,您可以设置ido-use-virtual-bufferst,然后ido让您切换到已关闭的文件,并根据需要重新打开它们。

于 2012-08-11T20:39:34.250 回答
2

为避免这些缓冲区妨碍您,您可以定义键绑定以循环遍历“用户缓冲区”和“无用缓冲区”:

http://ergoemacs.org/emacs/effective_emacs.html,“切换下一个/上一个用户缓冲区”部分

但一些有用的缓冲区以 * 开头,如 shell、编译缓冲区、ielm 等。

于 2012-08-13T10:37:47.770 回答
2

正如用户所说,最好使用智能缓冲区切换包,例如iswitchband idoiswitchb'siswitchb-buffer-ignoreido'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)))
于 2012-08-11T16:14:47.970 回答