Jak ustawić automatyczne odświeżanie ibuffera na liście buforów?

11
  1. M-x ibuffer
  2. Wybierz bufor
  3. Zabij ten bufor

Po zabiciu bufora ponownie pojawia się bufor ibuffera, ale nadal pokazuje nazwę bufora zabitego w kroku 3.

Czy możliwe jest automatyczne odświeżanie listy buforów przez ibuffer?

Kevin Wright
źródło
Jeśli naciśniesz Ctrl-x Ctrl-b ponownie w ibufferze, spowoduje to automatyczne odświeżanie.
ofenerci
@ofenerci Dla mnie (v25.2.2) Cx Cb otwiera dodatkowe okno * Lista buforów * z bieżącą listą buforów, ale * Ibuffer * pozostaje niezmieniony
2740

Odpowiedzi:

13

Uruchomienie polecenia ibuffer-auto-modew buforze Ibuffer powoduje odświeżenie ekranu po każdym poleceniu interaktywnym.

Wydaje się, że nie ma bezpośredniego sposobu na automatyczną aktywację. Możesz umieścić to w swoim pliku init:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))
Gilles „SO- przestań być zły”
źródło
1
To zaakceptowane rozwiązanie przerywa wybór w innym buforze. Po włączeniu tego zaczepu, jeśli dokonam wyboru w dowolnym buforze, a następnie wywołam ibuffer, wybór zostanie utracony.
nephewtom
8

Właściwym sposobem na to jest wprowadzenie wsparcia ibufferdla auto-revert-mode. Można to osiągnąć, definiując buffer-stale-functiondla tych buforów. Być może, skoro buffer-menuobsługuje tę funkcję, dobrze byłoby mieć ją również wcześniej ibuffer, ale wydaje się, że tak nie jest na razie.

Tak czy inaczej, oto sposób na zrobienie tego:

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

Uwaga: ogólnie rzecz biorąc, należałoby zdefiniować wartość revert-buffer-function, ale ibufferjuż to robi (jest ustawiona na ibuffer-update)

Sigma
źródło
1
Czy istnieje powód, aby preferować tę metodę ibuffer-auto-mode?
nispio
1
Dobrze auto-revert-modeużywa timerów i ibuffer-auto-modeużywa post-command-hook, więc jest oczywista różnica ; ale z drugiej strony nie mogłem powiedzieć, czy jedno jest lepsze od drugiego.
phils
4
@nispio Chyba wolę ogólne rozwiązania od rozwiązań ad-hoc. W tym sensie tworzenie ibufferbuforów zachowuje się jak inne, jeśli chodzi o odświeżanie przestarzałej zawartości, dla mnie jest czystsze. Poza tym ogólnie nie lubię nadużywać w post-command-hookten sposób: to naprawdę przesada, gdy zdarzy się, że zrobisz coś zupełnie niezwiązanego z buforem. Wreszcie, jeśli do odświeżenia treści jest wymagane naciśnięcie klawisza, równie dobrze może to być gjawny sposób aktualizacji treści. Ale oczywiście jest to kwestia filozoficzna :)
Sigma
1
Gdy korzystam z tej metody, ciągle pojawia się komunikat Reverting buffer `*Ibuffer*'. Wiadomość jest natrętna, ponieważ przeszkadza mi, gdy pracuję w minibuforze. Komunikat pojawia się, czy ibufferbufor jest widoczny, czy nie.
nispio
1
@nispio (setq auto-revert-verbose nil), potencjalnie lokalnie
Sigma