关闭所有干燥的缓冲区


23

有时我的缓冲区列表有10个以上的干燥窗口,而我最终使用buffer-menu来手动标记并杀死所有这些窗口。有没有更快的方法来关闭所有打开的干燥窗口?


我接受了最直接回答问题的答案。但是,我此后开始采取一些预防措施:emacs.stackexchange.com/a/1041/93
nispio 2014年

Answers:


32

您可以执行以下操作:

M-x ibuffer

* / 在干模式下标记缓冲区。

D 删除它们。


1
我以前从未听说过ibuffer。我一定会映射C-x C-bibuffer
nispio 2014年

您也可以按tdired-toggle-marks)标记所有(如果以前没有标记)。
caisah 2014年

@caisah dired-toggle-marks是名dired命令。按下t也可以切换ibuffer中的所有标记,但是非脏缓冲区通常比Dired缓冲区的数量要多,因此在这种情况下切换通常没有意义。
nispio 2014年

@nispio你是对的。我不知道为什么,但我想将所有缓冲液dired ...
caisah

1
注意:当没有Dired缓冲区时,这将无法正常工作,因为D不会应用于Dired缓冲区,而是应用于列表中的第一个缓冲区。
丹尼尔·库尔曼

10

dired建议您不要使用另一个函数来杀死所有缓冲区,而建议您利用中的过滤器组ibuffer,它可以让您按多种条件对缓冲区进行分组。

这是设置过滤器组的示例:

(setq-default ibuffer-saved-filter-groups
              `(("Default"
                 ;; I create a group call Dired, which contains all buffer in dired-mode
                 ("Dired" (mode . dired-mode))
                 ("Temporary" (name . "\*.*\*"))
                 )))

然后C-x C-b打开ibuffer窗口,您可以看到如下所示:

例子1

将光标移至[ Dired ](用M-pM-n),然后按d将其标记为删除

例子2

然后按x执行。

我更喜欢这种方式,因为我不需要考虑如何将我的键绑定到新函数,并且我的缓冲区组织得更好。


ibuffer在评估您的代码后,我首次启动时,筛选器组没有为我显示。我必须点击/ R(绑定到ibuffer-switch-to-saved-filter-groups)才能获得分组。
itsjeyd 2014年

(ibuffer-switch-to-saved-filter-groups "Default")您可以将这行代码添加到ibuffer挂钩中,如果不是,则应更改过滤器组名称Default
Rangi Lin

1
是的,那就是我最终要做的。在阅读您的答案之前不了解过滤器组,感谢您提到它们;)
2014年

10

您是否有很多Dired缓冲区,因为您一次都想要它们?IOW,您是否将它们分别创建为单独的缓冲区?

如果不是这样,则解决方案很简单:当您命中目录名称以在Dired中打开目录时,告诉Dired重用现有的Dired缓冲区RET

这样做的方法如下:

  1. 加载库Dired +dired+.el):

    (require 'dired+)
    
  2. 告诉Dired重用Dired缓冲区:

    (diredp-toggle-find-file-reuse-dir 1)
    

效果是,当您RET在Dired中的目录上单击(或单击鼠标)时,find-alternate-file会使用原来的Dired缓冲区替换为新缓冲区。

您可以随时使用Dired中的C-M-R(aka C-M-S-r)切换此行为。


这是我现在确定的解决方案。我从来没有想要过20个开放的Dired缓冲区。感谢您提出建议(并创建它)
。– nispio 2014年

链接已死,得到404 :(
Zelphir Kaltstahl '18年

1
@Zelphir:感谢您的单挑。现在应该可以。(Emacs Wiki通常会更改其URL,因此像这样的旧帖子已断开链接。)
Drew

8

像这样(滚动一下)?

(defun kill-dired-buffers ()
     (interactive)
     (mapc (lambda (buffer) 
           (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) 
             (kill-buffer buffer))) 
         (buffer-list)))

5

您也可以使用helm-mini

  • 运行M-x helm-mini
  • 在提示中输入:(*Di部分单词为Dired,无需输入更多)。在键入时,缓冲区会逐渐缩小。现在,只剩下Dired缓冲区。按下M-a以标记所有。
  • TAB切换到动作菜单,然后按K选择动作Kill buffer(s)
  • 按下RET执行操作。

好处helm-mini是它可以代替普通的Emacs C-x b,因此您不必使用两个键绑定,一个用于切换缓冲区,一个用于实际的缓冲区管理器。helm-mini是多合一的。在我的掌舵指南中阅读更多内容。

helm-mini还可以模糊匹配缓冲器和允许打开多个缓冲器通过有标记C-SPCM-a(静置中号方舟一个 LL)。您还可以通过@在模式之前追加来缩小包含某些字符串的缓冲区,例如,@test意味着仅选择包含字符串“ test”的缓冲区。


1

我会尝试这样的事情:

(require 'dash)

(defun my-kill-dired-buffers ()
  (interactive)
  (kill-some-buffers
   (-filter (lambda (buffer)
              (save-excursion
                (set-buffer buffer)
                (eq major-mode 'dired-mode)))
            (buffer-list))))

1
我相信MELPA的-filter要求dash.el。您可能应该将其列为要求。
Vamsi 2014年

1

您可能实际上正在寻找的是一种自动清除不需要的缓冲区的方法,在这种情况下,您应该签出midnight.elEmacs的一部分。

但总的来说,ibuffer使它很容易在批量缓冲区上进行操作,正如Francisco所建议的。


1

如果使用Icicles,则可以C-x k用来杀死所有Dired缓冲区-或任何给定模式下的所有缓冲区。

点击后C-x k,用于C-x M +仅将缓冲区保留为特定模式。点击TAB查看模式,然后选择dired-mode。然后使用该模式C-!杀死所有缓冲区。

C-x k C-x M + dired-mode C-!
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.