¿Cómo puedo hacer que ibuffer actualice automáticamente la lista de buffers?

11
  1. M-x ibuffer
  2. Seleccione un buffer
  3. Mata ese búfer

Después de que se elimina el búfer, el búfer ibuffer vuelve a aparecer, pero aún muestra el nombre del búfer eliminado en el paso 3.

¿Es posible hacer que ibuffer actualice automáticamente la lista de buffers?

Kevin Wright
fuente
Si presiona Ctrl-x Ctrl-b nuevamente en ibuffer, se actualiza automáticamente.
ofenerci
@ofenerci Para mí (v25.2.2) Cx Cb abre una ventana adicional * Buffer List * con la lista actual de buffers, pero el * Ibuffer * no se modifica
user2740

Respuestas:

13

Ejecutar el comando ibuffer-auto-modeen un búfer Ibuffer hace que actualice la pantalla después de cada comando interactivo.

No parece haber una forma directa de activarlo automáticamente. Puede poner esto en su archivo de inicio:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))
Gilles 'SO- deja de ser malvado'
fuente
1
Esta solución aceptada rompe la selección en otro búfer. Cuando habilito ese enlace, si hago una selección en cualquier búfer, invoco ibuffer, la selección se pierde.
nephewtom
8

La forma correcta de hacerlo es introducir soporte ibufferpara auto-revert-mode. Esto se puede lograr definiendo buffer-stale-functionpara esos buffers. Podría decirse que, dado buffer-menuque es compatible con esa característica, sería bueno tenerla en sentido ascendente ibuffertambién, pero ese no parece ser el caso por ahora.

De todos modos, aquí hay una manera de hacerlo:

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

Nota: en general, uno necesitaría definir un valor para revert-buffer-function, pero ibufferya lo hace (está configurado en ibuffer-update)

Sigma
fuente
1
¿Hay alguna razón para preferir este método ibuffer-auto-mode?
nispio
1
Bien auto-revert-modeusa temporizadores y ibuffer-auto-modeusos post-command-hook, así que hay una diferencia obvia ; pero de improviso no podría decir si uno era preferible al otro.
phils
44
@nispio Creo que prefiero las soluciones genéricas a las ad-hoc. Entonces, en ese sentido, hacer que los ibufferbuffers se comporten como otros cuando se trata de actualizar contenido obsoleto me parece más limpio. Además, generalmente no me gusta abusar de post-command-hookesa manera: es realmente exagerado cuando haces algo completamente no relacionado en el búfer. Finalmente, si se requiere algún tipo de pulsación de tecla para actualizar el contenido, también podría serlo g, que es la forma explícita de actualizar el contenido. Pero, claro, es probablemente un problema filosófico :)
Sigma
1
Cuando uso este método, sigo recibiendo un mensaje. Reverting buffer `*Ibuffer*'. El mensaje es intrusivo porque me interrumpe cuando estoy trabajando en el minibúfer. El mensaje aparece si el ibufferbúfer es visible o no.
nispio
1
@nispio (setq auto-revert-verbose nil), potencialmente localmente
Sigma