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


Answers:


99

对于更手动的方法,可以使用列出所有缓冲区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)

我该如何返回ibuffer?@phils
alper

1
我不确定您要问什么,但是也许q?用C-h m学习的按键组合,就像任何其他的模式。
菲尔

53

来自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)))))

编辑:更新了吉尔斯的反馈


3
为什么干缓冲区不被杀死?我也想删除该文件
swdev

暂存缓冲区未设置buffer-file-name,因此remove-if-not在上例中对的调用将保留暂存缓冲区(以及暂存缓冲区,术语缓冲区,帮助缓冲区等,所有不访问文件的内容)。我想不出一个既可以关闭文件缓冲区又可以关闭Dired缓冲区的简单测试,基本上,您需要对mapc进行第二次完整的调用,而对Dired缓冲区进行另一种测试。
robru

一个简单的修改,也可以杀死干掉的缓冲区 (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)))))
Frinkr'Aug

看起来在这个视频中,男人能够做到这一点。他打开了一个新的Slime缓冲区,同时关闭了GNU缓冲区和其他缓冲区。你知道他是怎么做到的吗?youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist,2015年

替换cl-remove-if-notremove-if-not作品,但这并不会杀死*helm..缓冲区
alper

21

emacs中没有直接的方法可以做到这一点。

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

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

4
嗯,但这将关闭所有缓冲区。
Sridhar Ratnakumar,2010年

14

有一个内置命令m- x kill-some-buffers(我正在使用24.3.50)在我的下一步gui中(未在终端中尝试过,但请确保类似),然后可以批准杀死哪个缓冲区。


2
当您加载了1000多个缓冲区时,这特别有用。
ocodo

10
 (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的第一个答案。希望能帮助到你 :)


2
我的朋友们这就是人们分享想法的优雅解决方案的方式
克里斯·克拉克

4

我发现此解决方案是最简单的解决方案。这将删除当前缓冲区以外的所有缓冲区。您必须将此代码添加到.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)

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在其他缓冲区名称上添加更多以排除。

希望能帮助到你 :)


请参阅以获得我改进的解决方案。
azzamsa

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))

(string-equal (buffer-name) (buffer-name x))与相同(eq x (current-buffer)),只是效率较低。其余的or可以简化为(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.