对于更手动的方法,您可以使用 Cx Cb 列出所有缓冲区,使用 d 将列表中的缓冲区标记为删除,然后使用 x 删除它们。
我还建议将列表缓冲区替换为更高级的 ibuffer:(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)
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer
(delq (current-buffer)
(remove-if-not 'buffer-file-name (buffer-list)))))
编辑:根据 Gilles 的反馈进行了更新
buffer-file-name
,因此上例中对 remove-if-not
的调用将保留 dired 缓冲区(以及暂存缓冲区、术语缓冲区、帮助缓冲区等,任何不访问文件的内容)。我想不出一个简单的测试可以同时关闭文件缓冲区和 dired 缓冲区,您基本上需要对 mapc 进行第二次调用,并对 dired 缓冲区进行不同的测试。
(defun kill-other-buffers () "Kill all other buffers." (interactive) (mapc 'kill-buffer (delq (current-buffer) (remove-if-not '(lambda (x) (or (buffer-file-name x) (eq 'dired-mode (buffer-local-value 'major-mode x)))) (buffer-list)))))
cl-remove-if-not
替换为 remove-if-not
可行,但这不会杀死 *helm..
缓冲区
没有办法直接在 emacs 中执行此操作。
您可以编写一个函数来执行此操作。以下将关闭所有缓冲区:
(defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list)))
(delete (current-buffer) (buffer-list))
应该为您提供一个缓冲区列表,您可以在其中映射 kill-buffer
并避免终止当前缓冲区。
在我的下一步 gui 中有一个内置命令 m-x kill-some-buffers
(我使用的是 24.3.50)(未在终端中尝试过,但确定它是相似的)然后,您可以批准要杀死哪些缓冲区。
(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 上的第一个答案。希望能帮助到你 :)
buffer-list
的规范多年来是否发生了变化,但 (buffer-list (current-buffer))
可以按照上面的答案工作,NOT 工作。对当前规范执行 C-h f buffer-list RET
。
我发现这个解决方案是最简单的。这将删除除当前缓冲区之外的所有缓冲区。您必须将此代码添加到您的 .emacs
文件中
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
当然,然后您将它与 Mx kill-other-buffers
RET 或一起使用,您也将以下代码粘贴到 .emacs
文件中,然后只需按 CxCb
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
你也可以喜欢这个 - 杀死除当前缓冲区之外的所有缓冲区,*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
(eq x (current-buffer))
(member (buffer-name x) '("*Messages*" "*scratch*"))))
(buffer-list)))
(delete-other-windows))
(string-equal (buffer-name) (buffer-name x))
与 (eq x (current-buffer))
相同,只是效率较低。剩下的 or
可以简化为 (member (buffer-name x) '("*Messages*" "*scratch*"))
我已经使用 crux-kill-other-buffers 几个月了。
但我也希望删除缓冲区。 @Euge 和 @wenjun.yan 的答案解决了这个问题。但它会删除特殊的缓冲区(例如 *git-credential-cache--daemon*、*scratch*、helm operation 等)。所以我想出了这个(当前)解决方案。
(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
。
希望能帮助到你 :)
多年来,我一直使用此列表中的一种解决方案,但现在我有了自己的新解决方案。
(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 将缓冲区内置为一个可以迭代的集合。它使您有机会解析出您不想关闭的任何内容。在这里,我确保它不会关闭您修改的任何内容,并且它使用缓冲区文件名而不是缓冲区名,因此它不会杀死特殊缓冲区。我还添加了一个“除非”来取出当前缓冲区(尽管您显然可以将其添加到“何时”,我只是认为这更清楚)。
但是对于更通用的解决方案,我们可以将其定义为宏,并传入一个适用于所有这些缓冲区的函数。
(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)
这就是你想要的:
C-x 1
来源:https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
不定期副业成功案例分享
ibuffer
返回? @philsq
?与任何其他模式一样,使用C-h m
来学习键绑定。