代码之家  ›  专栏  ›  技术社区  ›  Sridhar Ratnakumar

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

  •  83
  • Sridhar Ratnakumar  · 技术社区  · 16 年前

    如何关闭Emacs中除当前缓冲区之外的所有缓冲区?类似于现代网络浏览器中的“关闭其他标签”功能?

    8 回复  |  直到 7 年前
        1
  •  90
  •   phils    16 年前

    对于更手动的方法,可以列出 C-X-C-B ,在列表中标记要删除的缓冲区 D 然后使用 X 移除它们。

    我还建议用更高级的ibuffer替换列表缓冲区: (global-set-key (kbd "C-x C-b") 'ibuffer) . 以上内容将与iBuffer一起使用,但您也可以这样做:

    (标记要保留的缓冲区)
    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)
    
        2
  •  50
  •   Sridhar Ratnakumar    16 年前

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

    编辑 :根据Gilles的反馈更新

        3
  •  19
  •   Starkey    16 年前

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

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

    (defun close-all-buffers ()
      (interactive)
      (mapc 'kill-buffer (buffer-list)))
    
        4
  •  12
  •   pjammer    13 年前

    有一个内置的命令 - X kill-some-buffers (我使用的是24.3.50)在我的下一步图形用户界面中(不是在终端中尝试的,但肯定是类似的),你可以批准杀死哪个缓冲区。

        5
  •  9
  •   wenjun.yan    13 年前
     (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的第一个回答。希望有帮助:)

        6
  •  3
  •   Euge    9 年前

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

    (defun kill-other-buffers ()
          "Kill all other buffers."
          (interactive)
          (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
    

    当然,然后你用它 M—X kill-other-buffers 雷特 将以下代码粘贴到 Emacs 也归档,然后按 C-X C-B

    (global-set-key (kbd "C-x C-b") 'kill-other-buffers)
    
        7
  •  1
  •   azzamsa    7 年前

    我已经用过 crux-kill-other-buffers 几个月了。

    但我也希望脏的缓冲区也被删除。@尤格和@wenjun。严的回答解决了这个问题。但它将删除特殊缓冲区(例如*g it凭证缓存--守护进程*、*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 如果要排除的缓冲区名称。

    希望有帮助:)

        8
  •  0
  •   Navidot    8 年前

    你也可以喜欢这一个-杀死所有的缓冲区,除了当前的一个,*消息*和*抓取*(这很方便,我称之为“工具箱”),关闭多余的窗口,让你活在当前缓冲区的哪个窗口。

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