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