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

关闭Emacs中除当前缓冲区之外的所有缓冲区,emacs,elisp,Emacs,Elisp,如何关闭Emacs中除当前缓冲区之外的所有缓冲区?与现代web浏览器中的“关闭其他选项卡”功能类似?在emacs中没有直接执行此操作的方法 您可以编写一个函数来实现这一点。以下操作将关闭所有缓冲区: (defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list))) (取消关闭所有缓冲区() (互动) (mapc'终止缓冲区(缓冲区列表))) 发件人: 编辑:根据Gilles的反馈进行更新对于更手动的方

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

在emacs中没有直接执行此操作的方法

您可以编写一个函数来实现这一点。以下操作将关闭所有缓冲区:

(defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list))) (取消关闭所有缓冲区() (互动) (mapc'终止缓冲区(缓冲区列表))) 发件人:


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

对于更手动的方法,您可以使用C-x C-b列出所有缓冲区,在列表中用d标记要删除的缓冲区,然后使用x删除它们

我还建议将列表缓冲区替换为更高级的ibuffer:
(全局设置键(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)
正如你所期望的那样

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

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
(缓冲区列表(当前缓冲区))将返回一个包含所有现有缓冲区的列表,当前缓冲区位于列表的开头


这是我关于StackOverflow的第一个答案。希望它有帮助:)

在我的下一步gui中有一个内置命令m-x
杀死一些缓冲区(我使用的是24.3.50)(没有在终端上尝试过,但肯定是类似的),然后你可以批准杀死哪些缓冲区。

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

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
当然,然后将其与M-x
kill other buffers
RET一起使用,将以下代码也粘贴到
.emacs
文件中,然后只需按C-xC-b


你也可以喜欢这个——杀死除当前缓冲区之外的所有缓冲区,*消息*和*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
                           (eq x (current-buffer))
                           (member (buffer-name x) '("*Messages*" "*scratch*"))))
                       (buffer-list)))
  (delete-other-windows))
我已经用了几个月了

但我也希望删除dired缓冲区@Euge和@wenjun.yan的回答解决了这个问题。但它将删除特殊的缓冲区(例如*git凭证缓存--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)))))
灵感来源于。如果需要,您可以在其他缓冲区名称上添加更多要排除的条件


希望有帮助:)

这就是您想要的:

C-x 1

来源:

Ah,但这将关闭所有缓冲区。
(删除(当前缓冲区)(缓冲区列表))
应提供一个缓冲区列表,您可以将其映射到
kill buffer
,避免杀死当前缓冲区。为什么不杀死dired buffer?我想删除的是,alsodired缓冲区不设置
缓冲区文件名
,因此在上面的示例中调用
remove if not
,将保留dired缓冲区(以及临时缓冲区、术语缓冲区、帮助缓冲区等,任何不访问文件的内容)。我想不出一个简单的测试可以同时关闭文件缓冲区和dired缓冲区,你基本上需要对mapc进行第二次调用,对dired缓冲区进行不同的测试。一个简单的修改可以同时杀死dired缓冲区
(defun kill other buffers()“杀死所有其他缓冲区”。(交互式)(mapc'kill buffer(delq(当前缓冲区)(如果没有删除)(lambda(x)(或(缓冲区文件名x)(eq'dired mode(缓冲区本地值'主模式x))))(缓冲区列表(()()))
在这段视频中,这名男子似乎能够做到这一点。他在关闭GNU缓冲区和其他缓冲区的同时打开了一个新的粘液缓冲区。你知道他是如何做到的吗?将
cl-remove-if-not
替换为
remove-if-not
有效,但这不会杀死
*helm..
缓冲区这在你有1000+b时特别有用uffers loaded.@ocodo你的意思是字面上的还是比喻上的?我的朋友们,这是因为人们分享他们的想法而产生的优雅解决方案。我不知道
缓冲区列表的规范多年来是否发生了变化,但是
(缓冲区列表(当前缓冲区))
按照上面的答案工作将不起作用。对于当前规范,请执行
C-h f buffer list RET
。有关我的改进解决方案,请参阅。
(字符串相等(缓冲区名称)(缓冲区名称x))
(eq x(当前缓冲区))
相同,只是效率较低。剩余的
可以简化为
(成员)(缓冲区名称x)“”(“*消息*”*“*暂存*”)
@Stefan好的一点我会修改它。我认为你被否决的原因是OP要求关闭其他缓冲区,而不是windows。Emacs术语可能有点混乱。我如何从
ibuffer
返回?@philsI不确定你在问什么,但可能
q
?使用
C-h m
学习键绑定,就像使用任何其他模式。
(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
                           (eq x (current-buffer))
                           (member (buffer-name x) '("*Messages*" "*scratch*"))))
                       (buffer-list)))
  (delete-other-windows))
(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)))))
C-x 1