如何使ibuffer自动刷新缓冲区列表?


11
  1. M-x ibuffer
  2. 选择一个缓冲区
  3. 杀死缓冲区

缓冲区被杀死后,ibuffer缓冲区会重新出现,但仍显示在步骤3中被杀死的缓冲区名称。

是否可以让ibuffer自动刷新缓冲区列表?


如果在ibuffer中再次按Ctrl-x Ctrl-b,它将自动刷新。
ofenerci

@ofenerci对我来说(v25.2.2)Cx Cb使用当前缓冲区列表打开另一个窗口* Buffer List *,但* Ibuffer *保持不变
user2740

Answers:


13

ibuffer-auto-mode在Ibuffer缓冲区中运行命令会使它在每次交互命令后刷新显示。

似乎没有直接激活它的直接方法。您可以将其放入您的init文件中:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))

1
这种公认的解决方案破坏了其他缓冲区中的选择。当我启用该挂钩时,如果我在任何缓冲区上进行选择,然后调用ibuffer,那么选择将丢失。
nephewtom

8

正确的方法是在ibufferfor中引入支持auto-revert-mode。这可以通过buffer-stale-function为那些缓冲区定义来实现。可以说,由于buffer-menu支持该功能,因此最好将其也提供上游ibuffer,但是目前看来情况并非如此。

无论如何,这是一种实现方法:

(defun my-ibuffer-stale-p (&optional noconfirm)
  ;; let's reuse the variable that's used for 'ibuffer-auto-mode
  (frame-or-buffer-changed-p 'ibuffer-auto-buffers-changed))

(defun my-ibuffer-auto-revert-setup ()
  (set (make-local-variable 'buffer-stale-function)
       'my-ibuffer-stale-p)
  (set (make-local-variable 'auto-revert-verbose) nil)
  (auto-revert-mode 1))

(add-hook 'ibuffer-mode-hook 'my-ibuffer-auto-revert-setup)

注意:通常,您需要为定义一个值revert-buffer-function,但是ibuffer已经定义了(将其设置为ibuffer-update


1
有没有理由更喜欢这种方法ibuffer-auto-mode
nispio 2014年

1
auto-revert-mode使用计时器,然后ibuffer-auto-mode使用post-command-hook,所以有明显的区别;但是暂时我不能说一个比另一个更好。
phils 2014年

4
@nispio我想我倾向于一般解决方案而不是临时解决方案。因此,从某种意义上说,ibuffer在刷新过时的内容时,使缓冲区表现得与其他缓冲区一样对我来说更干净。另外,我通常不喜欢这种滥用post-command-hook方式:当您碰巧在缓冲区中执行完全无关的操作时,这实在是过大了。最后,如果需要某种击键来刷新内容,则也可能是g,这是更新内容的显式方法。但是理所当然,这可能是一个哲学问题:)
Sigma

1
当我使用此方法时,我会不断收到一条消息Reverting buffer `*Ibuffer*'. 该消息具有干扰性,因为当我在小型缓冲区中工作时,该消息不断打扰我。无论ibuffer缓冲区是否可见,都会出现该消息。
nispio 2014年

1
@nispio (setq auto-revert-verbose nil),潜在地局部
西格玛
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.