Come posso fare in modo che ibuffer aggiorni automaticamente l'elenco dei buffer?


11
  1. M-x ibuffer
  2. Seleziona un buffer
  3. Uccidi quel buffer

Dopo che il buffer è stato ucciso, viene nuovamente visualizzato il buffer ibuffer, ma mostra ancora il nome del buffer ucciso nel passaggio 3.

È possibile aggiornare automaticamente l'elenco dei buffer con ibuffer?


Se premi di nuovo Ctrl-x Ctrl-b in ibuffer, si rende autorefresh.
ofenerci il

@ofenerci Per me (v25.2.2) Cx Cb apre una finestra aggiuntiva * Elenco buffer * con l'elenco corrente di buffer, ma * Ibuffer * rimane invariato
user2740

Risposte:


13

L'esecuzione del comando ibuffer-auto-modein un buffer Ibuffer consente di aggiornare il display dopo ogni comando interattivo.

Non sembra esserci un modo diretto per attivarlo automaticamente. Puoi metterlo nel tuo file init:

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

1
Questa soluzione accettata interrompe la selezione in un altro buffer. Quando abilito quell'hook, se faccio una selezione su qualsiasi buffer, quindi invoco ibuffer, la selezione viene persa.
nipote il

8

Il modo giusto per farlo è introdurre supporto ibufferper auto-revert-mode. Ciò può essere ottenuto definendo buffer-stale-functionper quei buffer. Probabilmente, poiché buffer-menusupporta questa funzione, sarebbe bene averlo anche a monte ibuffer, ma per ora non sembra essere il caso.

Ad ogni modo, ecco un modo per farlo:

(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: in generale, è necessario definire un valore per revert-buffer-function, ma lo ibufferfa già (è impostato su ibuffer-update)


1
C'è un motivo per preferire questo metodo rispetto ibuffer-auto-mode?
nispio,

1
Bene auto-revert-modeusa i timer e ibuffer-auto-modeusa post-command-hook, quindi c'è un'ovvia differenza ; ma con disinvoltura non saprei dire se uno fosse preferibile all'altro.
phils,

4
@nispio Immagino che tendo a preferire soluzioni generiche a soluzioni ad hoc. Quindi, in questo senso, rendere i ibufferbuffer comportarsi come gli altri quando si tratta di aggiornare i contenuti obsoleti mi sembra più pulito. Inoltre, in genere non mi piace abusare in post-command-hookquel modo: è davvero eccessivo quando ti capita di fare qualcosa di completamente estraneo al buffer. Infine, se è necessario un tipo di sequenza di tasti per aggiornare il contenuto, potrebbe anche essere g, che è il modo esplicito di aggiornare il contenuto. Ma scontato, è probabilmente un problema filosofico :)
Sigma,

1
Quando uso questo metodo, continuo a ricevere un messaggio Reverting buffer `*Ibuffer*'. Il messaggio è invadente perché continua a interrompermi quando lavoro nel minibuffer. Viene visualizzato il messaggio se il ibufferbuffer è visibile o meno.
nispio,

1
@nispio (setq auto-revert-verbose nil), potenzialmente localmente
Sigma
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.