如何关闭Emacs中除当前缓冲区以外的所有缓冲区?与现代网络浏览器中的“关闭其他标签页”功能类似吗?
如何关闭Emacs中除当前缓冲区以外的所有缓冲区?与现代网络浏览器中的“关闭其他标签页”功能类似吗?
Answers:
对于更手动的方法,可以使用列出所有缓冲区C-x C-b,在列表中标记要删除的缓冲区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)
q
?用C-h m
学习的按键组合,就像任何其他的模式。
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer
(delq (current-buffer)
(remove-if-not 'buffer-file-name (buffer-list)))))
编辑:更新了吉尔斯的反馈
buffer-file-name
,因此remove-if-not
在上例中对的调用将保留暂存缓冲区(以及暂存缓冲区,术语缓冲区,帮助缓冲区等,所有不访问文件的内容)。我想不出一个既可以关闭文件缓冲区又可以关闭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() (互动) (mapc'kill-buffer(buffer-list)))
(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的第一个答案。希望能帮助到你 :)
我发现此解决方案是最简单的解决方案。这将删除当前缓冲区以外的所有缓冲区。您必须将此代码添加到.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
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
我已经使用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
在其他缓冲区名称上添加更多以排除。
希望能帮助到你 :)
您也可以喜欢此缓冲区-杀死当前缓冲区之外的所有缓冲区,* 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))
(string-equal (buffer-name) (buffer-name x))
与相同(eq x (current-buffer))
,只是效率较低。其余的or
可以简化为(member (buffer-name x) '("*Messages*" "*scratch*"))
ibuffer
?@phils