关闭除Emacs中当前缓冲区之外的所有缓冲区

时间:2010-08-05 17:29:27

标签: emacs elisp

如何在Emacs中关闭除当前缓冲区之外的所有缓冲区?与现代Web浏览器中的“关闭其他标签”功能类似?

10 个答案:

答案 0 :(得分:92)

对于更加手动的方法,您可以使用 Cx Cb 列出所有缓冲区,使用 d 标记列表中的缓冲区,然后使用 x < / kbd>删除它们。

我还建议使用更高级的ibuffer替换list-buffers:(global-set-key (kbd "C-x C-b") 'ibuffer)。以上内容适用于ibuffer,但您也可以这样做:

m (标记要保留的缓冲区)
t (切换标记)
D (杀死所有标记的缓冲区)

我还使用了Emacs Wiki中的这个片段,这将进一步简化这种手动方法:

;; Ensure ibuffer opens with point at the current buffer's entry.
(defadvice ibuffer
  (around ibuffer-point-to-most-recent) ()
  "Open ibuffer with cursor pointed to most recent buffer name."
  (let ((recent-buffer-name (buffer-name)))
    ad-do-it
    (ibuffer-jump-to-buffer recent-buffer-name)))
(ad-activate 'ibuffer)

答案 1 :(得分:50)

来自EmacsWiki: Killing Buffers

(defun kill-other-buffers ()
    "Kill all other buffers."
    (interactive)
    (mapc 'kill-buffer 
          (delq (current-buffer) 
                (remove-if-not 'buffer-file-name (buffer-list)))))

编辑:根据Gilles的反馈进行了更新

答案 2 :(得分:19)

直接在emacs中没有办法做到这一点。

您可以编写一个函数来执行此操作。以下将关闭所有缓冲区:

(defun close-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))

答案 3 :(得分:12)

内置命令 m - x kill-some-buffers(我正在使用24.3.50)在我的nextstep gui中(未在终端中尝试过)但确定它是相似的)然后你可以批准杀死哪些缓冲区。

答案 4 :(得分:9)

 (defun only-current-buffer () 
   (interactive)
   (let ((tobe-killed (cdr (buffer-list (current-buffer)))))
     (while tobe-killed
       (kill-buffer (car tobe-killed))
       (setq tobe-killed (cdr tobe-killed)))))

它按预期工作。

在阅读@ Starkey的回答后,我认为这会更好:

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))

(buffer-list(current-buffer))将返回一个包含所有现有缓冲区的列表,当前缓冲区位于列表的开头。

这是我在StackOverflow上的第一个答案。希望它有所帮助:)

答案 5 :(得分:3)

我发现这个解决方案是最简单的。这将删除除当前缓冲区之外的所有缓冲区。您必须将此代码添加到.emacs文件

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))

当然,然后你将它与 Mx kill-other-buffers RET 一起使用,将以下代码粘贴到{{1文件也然后按 Cx Cb

.emacs

答案 6 :(得分:1)

我已经使用crux-kill-other-buffers了几个月。

但我也希望删除烦人的缓冲区。 @Euge和@ wenjun.yan的答案解决了这个问题。但是它将删除特殊的缓冲区(例如* git-credential-cache--daemon *,* scratch *,helm操作等)。所以我想出了这个(当前)解决方案。

(defun aza-kill-other-buffers ()
  "Kill all buffers but current buffer and special buffers"
  (interactive)
  (dolist (buffer (delq (current-buffer) (buffer-list)))
    (let ((name (buffer-name buffer)))
      (when (and name (not (string-equal name ""))
             (/= (aref name 0) ?\s)
             (string-match "^[^\*]" name))
        (funcall 'kill-buffer buffer)))))

灵感来自kill-matching-buffers。如果需要,可以在其他缓冲区名称上添加更多condition以排除。

希望它会有所帮助:)

答案 7 :(得分:0)

您也可以喜欢这个缓冲区-杀死除当前缓冲区之外的所有缓冲区,即* Messages *和* scratch *(它们很方便,我称它们为“工具箱”),同时也关闭多余的窗口,让您活在其中一个窗口哪个当前缓冲区。

(defun my/kill-all-buffers-except-toolbox ()
  "Kill all buffers except current one and toolkit (*Messages*, *scratch*). Close other windows."
  (interactive)
  (mapc 'kill-buffer (remove-if
                       (lambda (x)
                         (or
                           (string-equal (buffer-name) (buffer-name x))
                           (string-equal "*Messages*" (buffer-name x))
                           (string-equal "*scratch*" (buffer-name x))))
                       (buffer-list)))
  (delete-other-windows))

答案 8 :(得分:0)

答案 9 :(得分:0)

我多年来一直使用此列表中的一种解决方案,但现在我有了自己的新解决方案。

(defun kill-all-file-buffers ()
  "Kills all buffers that are open to files. Does not kill
modified buffers or special buffers."
  (interactive)
  (mapc 'kill-buffer (cl-loop for buffer being the buffers
                              when (and (buffer-file-name buffer)
                                        (not (buffer-modified-p buffer)))
                              unless (eq buffer (current-buffer))
                              collect buffer)))

cl-loop 具有作为集合内置的缓冲区,您可以对其进行迭代。它让您有机会解析出您不想关闭的任何内容。在这里,我确保它不会关闭您修改过的任何内容,并且它使用 buffer-file-name 而不仅仅是 buffer-name,因此它不会杀死特殊的缓冲区。我还添加了一个“除非”以取出当前缓冲区(尽管您显然可以将其添加到“何时”,但我只是认为这样更清楚)。

但对于更通用的解决方案,我们可以将其定义为一个宏,并传入一个将应用于所有这些缓冲区的函数。

(defmacro operate-on-file-buffers (func)
  "Takes any function that takes a single buffer as an argument
and applies that to all open file buffers that haven't been
modified, and aren't the current one."
  `(mapc ,func (cl-loop for buffer being the buffers
                            when (and (buffer-file-name buffer)
                                      (not (buffer-modified-p buffer)))
                            unless (eq buffer (current-buffer))
                            collect buffer)))

现在如果你想杀死所有匹配这个的缓冲区,你可以这样调用

(operate-on-file-buffers 'kill-buffer)