Como faço para o ibuffer atualizar automaticamente a lista de buffers?

11
  1. M-x ibuffer
  2. Selecione um buffer
  3. Mate esse buffer

Depois que o buffer é eliminado, o buffer de ibuffer reaparece, mas ainda mostra o nome do buffer eliminado na etapa 3.

É possível que o ibuffer atualize automaticamente a lista de buffers?

Kevin Wright
fonte
Se você pressionar Ctrl-x Ctrl-b novamente no ibuffer, fará a atualização automática.
ofenerci 30/08/19
@ofenerci Para mim (v25.2.2) Cx Cb abre uma janela adicional * Buffer List * com a lista atual de buffers, mas o * Ibuffer * permanece inalterado
user2740

Respostas:

13

A execução do comando ibuffer-auto-modeem um buffer Ibuffer faz com que você atualize a exibição após cada comando interativo.

Não parece haver uma maneira direta de ativá-lo automaticamente. Você pode colocar isso no seu arquivo init:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))
Gilles 'SO- parar de ser mau'
fonte
1
Essa solução aceita interrompe a seleção em outro buffer. Quando eu ativo esse gancho, se eu fizer uma seleção em qualquer buffer e invocar ibuffer, a seleção será perdida.
Nephewtom 23/06
8

A maneira certa de fazer isso é introduzir suporte ibufferpara auto-revert-mode. Isso pode ser alcançado definindo buffer-stale-functionpara esses buffers. Indiscutivelmente, como buffer-menusuporta esse recurso, seria bom tê-lo a montante ibuffertambém, mas isso não parece ser o caso por enquanto.

De qualquer forma, aqui está uma maneira de fazê-lo:

(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: em geral, seria necessário definir um valor para revert-buffer-function, mas ibufferjá o faz (está definido como ibuffer-update)

Sigma
fonte
1
Existe uma razão para preferir esse método ibuffer-auto-mode?
Nispio 15/10
1
Bem auto-revert-modeusa temporizadores e ibuffer-auto-modeusa post-command-hook, então há uma diferença óbvia ; mas de imediato eu não sabia dizer se um era preferível ao outro.
phils
4
@nispio Acho que prefiro soluções genéricas a ad-hoc. Portanto, nesse sentido, fazer com que os ibufferbuffers se comportem como os outros quando se trata de atualizar conteúdo desatualizado parece mais limpo para mim. Além disso, geralmente não gosto de abusar post-command-hookdessa maneira: é realmente um exagero quando você faz algo completamente não relacionado no buffer. Por fim, se for necessário algum tipo de pressionamento de tecla para que o conteúdo seja atualizado, é possível que seja g, que é a maneira explícita de atualizar o conteúdo. Mas concedido, é provavelmente uma questão filosófica :) #
Sigma
1
Quando uso esse método, continuo recebendo uma mensagem. Reverting buffer `*Ibuffer*'. A mensagem é intrusiva, pois me interrompe quando estou trabalhando no minibuffer. A mensagem aparece se o ibufferbuffer está visível ou não.
Nispio 15/10
1
@nispio (setq auto-revert-verbose nil), potencialmente localmente
Sigma