Flaky Goodness

Emacs ibuffer live update

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)