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

Rei*_*ica 88 emacs elisp

如何在Emacs中关闭除当前缓冲区之外的所有缓冲区?与现代Web浏览器中的"关闭其他标签"功能类似?

phi*_*ils 94

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

我还建议用更高级的ibuffer替换list-buffers : (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)
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 50

来自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)))))
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么dired缓冲区没有被杀死?我也想删除它 (3认同)

Sta*_*key 21

直接在emacs中没有办法做到这一点.

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

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

  • 啊,但这将关闭*all*缓冲区. (3认同)

pja*_*mer 13

有一个内置命令m- x kill-some-buffers(我正在使用24.3.50)在我的nextstep gui(未在终端尝试但确定它类似)你可以批准杀死哪些缓冲区.

  • @ocodo 你是字面意思还是比喻意思 (3认同)
  • 当您加载了1000多个缓冲区时,这尤其有用. (2认同)

wen*_*yan 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)))))
Run Code Online (Sandbox Code Playgroud)

它按预期工作.

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

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
Run Code Online (Sandbox Code Playgroud)

(buffer-list(current-buffer))将返回一个包含所有现有缓冲区的列表,当前缓冲区位于列表的开头.

这是我在StackOverflow上的第一个答案.希望能帮助到你 :)

  • 我的朋友们就是人们分享他们的想法所带来的优雅解决方案 (2认同)

Eug*_*uge 6

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

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
Run Code Online (Sandbox Code Playgroud)

当然,然后您使用它M-x kill-other-buffers RET 或者您也将以下代码粘贴到.emacs文件中,然后只需按C-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Run Code Online (Sandbox Code Playgroud)