September 14, 2025
Inspired by a a recent post by The Emacs Cat about their ibuffer configuration, I was wondering why the ibuffer didn’t update live as buffers were created and killed. With some help from Prot here is a way to hook into the relevant function in Emacs to update the ibuffer list any time the list of buffers changes. The real-time feedback makes managing a large number of buffers more pleasant.
This code sets a timer to start every time the buffer-list is updated. The timer is debounced, so that it only fires once even if a number of buffers are updated one after another. When the timer fires, any ibuffer that is currently open gets refreshed. Very nice.
(defvar my/ibuffer-refresh-timer nil "Debounce timer for ibuffer refreshes triggered by buffer list changes.") (defun my/ibuffer-refresh-start-timer () (when my/ibuffer-refresh-timer (cancel-timer my/ibuffer-refresh-timer)) (setq my/ibuffer-refresh-timer (run-at-time 0.2 nil #'my/ibuffer-refresh))) (defun my/ibuffer-refresh () (setq my/ibuffer-refresh-timer nil) (when-let ((buffers (seq-filter (lambda (buf) (with-current-buffer buf (derived-mode-p 'ibuffer-mode))) (buffer-list)))) (dolist (buf buffers) (with-current-buffer buf (ibuffer-update nil :silent))))) (add-hook 'buffer-list-update-hook #'my/ibuffer-refresh-start-timer)