Bagaimana saya bisa membuat ibuffer me-refresh daftar buffer?

11
  1. M-x ibuffer
  2. Pilih penyangga
  3. Bunuh buffer itu

Setelah buffer terbunuh, buffer ibuffer kembali muncul, tetapi masih menunjukkan nama buffer yang terbunuh pada langkah 3.

Apakah mungkin membuat ibuffer me-refresh daftar buffer?

Kevin Wright
sumber
Jika Anda menekan Ctrl-x Ctrl-b lagi di ibuffer, itu membuat autorefresh.
ofenerci
@ofenerci Bagi saya (v25.2.2) Cx Cb membuka jendela tambahan * Daftar Buffer * dengan daftar buffer saat ini, tetapi * Ibuffer * tidak berubah
user2740

Jawaban:

13

Menjalankan perintah ibuffer-auto-modedalam Buffer Buffer membuatnya menyegarkan tampilan setelah setiap perintah interaktif.

Tampaknya tidak ada cara langsung untuk mengaktifkannya secara otomatis. Anda dapat meletakkan ini di file init Anda:

(add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1)))
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Solusi yang diterima ini memecah seleksi dalam buffer lain. Ketika saya mengaktifkan hook itu, jika saya melakukan seleksi pada buffer apa pun, lalu memanggil ibuffer, pilihan hilang.
nephewtom
8

Cara yang tepat untuk melakukannya adalah dengan memperkenalkan dukungan ibufferuntuk auto-revert-mode. Ini dapat dicapai dengan mendefinisikan buffer-stale-functionbagi mereka penyangga. Dapat diperdebatkan, karena buffer-menumendukung fitur itu, akan lebih baik untuk memilikinya di hulu ibufferjuga, tetapi sepertinya tidak demikian untuk saat ini.

Bagaimanapun, inilah cara untuk melakukannya:

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

Catatan: secara umum, seseorang perlu mendefinisikan nilai untuk revert-buffer-function, tetapi ibuffersudah melakukannya (disetel ke ibuffer-update)

Sigma
sumber
1
Apakah ada alasan untuk lebih menyukai metode ini ibuffer-auto-mode?
nispio
1
Baik auto-revert-modemenggunakan timer, dan ibuffer-auto-modemenggunakan post-command-hook, jadi ada perbedaan yang jelas ; tetapi begitu saja saya tidak bisa mengatakan apakah yang satu lebih disukai dari yang lain.
phils
4
@nispio Saya kira saya cenderung lebih suka solusi generik daripada yang ad-hoc. Jadi dalam hal itu, membuat ibufferbuffer berperilaku seperti orang lain ketika datang untuk menyegarkan konten usang terasa lebih bersih bagi saya. Juga, saya biasanya tidak suka menyalahgunakan post-command-hookcara itu: itu benar-benar berlebihan ketika Anda melakukan sesuatu yang sama sekali tidak terkait dalam buffer. Akhirnya, jika beberapa jenis keystroke diperlukan untuk konten di-refresh, mungkin juga g, yang merupakan cara eksplisit untuk memperbarui konten. Tapi memang, itu mungkin masalah filosofis :)
Sigma
1
Ketika saya menggunakan metode ini, saya terus menerima pesan Reverting buffer `*Ibuffer*'. . Pesan itu mengganggu karena terus mengganggu saya ketika saya bekerja di minibuffer. Pesan muncul apakah ibufferbuffer terlihat atau tidak.
nispio
1
@nispio (setq auto-revert-verbose nil), berpotensi lokal
Sigma