Как сделать так, чтобы ibuffer автоматически обновлял список буферов?

11
  1. M-x ibuffer
  2. Выберите буфер
  3. Убей этот буфер

После уничтожения буфера вновь появляется буфер ibuffer, но он по-прежнему показывает имя буфера, уничтоженное на шаге 3.

Возможно ли автоматическое обновление списка буферов ibuffer?

Кевин Райт
источник
Если вы снова нажмете Ctrl-x Ctrl-b в ibuffer, произойдет автоматическое обновление.
ofenerci
@ofenerci Для меня (v25.2.2) Cx Cb открывает дополнительное окно * Список буферов * с текущим списком буферов, но * Ibuffer * остается без изменений
user2740

Ответы:

13

Запуск команды ibuffer-auto-modeв буфере Ibuffer заставляет ее обновлять отображение после каждой интерактивной команды.

Кажется, нет прямого способа активировать его автоматически. Вы можете поместить это в ваш файл инициализации:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))
Жиль "ТАК - прекрати быть злым"
источник
1
Это принятое решение нарушает выбор в другом буфере. Когда я включаю эту ловушку, если я делаю выборку в любом буфере, а затем вызываю ibuffer, выбор теряется.
племянник
8

Правильный способ сделать это заключается в ознакомлении поддержки в ibufferтечение 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?
Ниспио
1
Хорошо auto-revert-modeиспользует таймеры и ibuffer-auto-modeиспользует post-command-hook, так что есть очевидная разница ; но я не мог сказать, был ли один предпочтительнее другого.
phils
4
@nispio Думаю, я предпочитаю общие решения, а не специальные. Так что в этом смысле, когда ibufferбуферы ведут себя как другие, когда дело доходит до обновления устаревшего контента, я чувствую себя чище. Кроме того, я, как правило, не люблю злоупотреблять post-command-hookтаким образом: это действительно излишне, когда вы делаете что-то совершенно не связанное с буфером. Наконец, если для обновления содержимого требуется какое-то нажатие клавиши, это также может быть g, что является явным способом обновления содержимого. Но само собой разумеющееся, это, вероятно, философская проблема :)
Sigma
1
Когда я использую этот метод, я получаю сообщение Reverting buffer `*Ibuffer*'. . Сообщение навязчиво, потому что оно продолжает мешать мне, когда я работаю в минибуфере. Сообщение появляется независимо от того, ibufferвиден буфер или нет.
Ниспио
1
@nispio (setq auto-revert-verbose nil), потенциально локально
Sigma