On 2022-06-26 04:10, Eli Zaretskii wrote: >> Regardless, given that the temporary buffer is modified in my >> original example, shouldn't `after-change-functions' run? > > Is the temporary buffer indeed modified, and is the hook set in that > buffer? Yes on both accounts. See updated test below. I changed the test to switch to the temporary buffer in the selected window and it now reliably inserts "x" into the temporary buffer. It still doesn't run the `after-change-functions' hook, however. Updated test code: ;; -*- lexical-binding: t; -*- (require 'ert) (require 'ert-x) (defvar-local acf 0) (defun acf (&rest _) (setq-local acf (1+ acf))) (ert-deftest test () (ert-with-test-buffer () (let ((b (current-buffer))) (save-window-excursion (with-current-buffer-window b `(display-buffer-below-selected (body-function . ,(lambda (window) (select-window window t) (should (eq (current-buffer) b)) (setq-local acf 0) ;; Note that LOCAL is t: (add-hook 'after-change-functions #'acf nil t) (should (memq #'acf after-change-functions)) (execute-kbd-macro (kbd "x")) (should (equal (buffer-string) "x")) ;; The above checks pass, this check fails: (should (equal acf 1))))) nil)))))