Як я можу зробити 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 змушує оновити відображення після кожної інтерактивної команди.

Прямий спосіб його активації, здається, не існує. Ви можете помістити це у свій файл init:

(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?
nispio

1
Добре auto-revert-modeвикористовує таймери та ibuffer-auto-modeвикористовує post-command-hook, тому очевидна різниця ; але я напевно не можу сказати, чи було краще одне з іншого.
філс

4
@nispio Я думаю, що я вважаю за краще віддавати загальні рішення тимчасовим рішенням. Тож у цьому сенсі ibufferзмушення буферів поводитись так, як інші, коли справа доходить до оновлення застарілого контенту, я відчуває себе більш чистою. Крім того, мені зазвичай не подобається зловживати post-command-hookтаким чином: це справді надмірно, коли трапляється робити щось абсолютно не пов’язане з буфером. Нарешті, якщо для оновлення вмісту потрібна якась натискання клавіш, це також може бути gявним способом оновлення контенту. Але, безумовно, це філософське питання :)
Sigma

1
Коли я використовую цей метод, я постійно отримую повідомлення Reverting buffer `*Ibuffer*'. . Повідомлення є нав'язливим, оскільки воно постійно перебиває мене, коли я працюю в мінібуфері. З'являється повідомлення, чи ibufferбуфер видимий чи ні.
nispio

1
@nispio (setq auto-revert-verbose nil), потенційно локально
Sigma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.