aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-20 23:32:49 -0500
committerCraig Jennings <c@cjennings.net>2026-07-20 23:32:49 -0500
commitc2f0f3ee16fe98393e1badaa09d2d24f5fb2179a (patch)
treec5a200f4b44e50a058283ec5fbf402ab19c04737
parent22006b0eaf357ec9ef1538492f497e4f0b8fb4bf (diff)
downloaddotemacs-c2f0f3ee16fe98393e1badaa09d2d24f5fb2179a.tar.gz
dotemacs-c2f0f3ee16fe98393e1badaa09d2d24f5fb2179a.zip
fix(undead-buffers): keep C-u on wrapper commands from spamming the undead list
The delegated cj/kill-buffer-or-bury-alive reads current-prefix-arg, so a prefixed wrapper call took the add-to-undead-list branch for every buffer: nothing killed, list spammed. The four wrappers now bind the prefix to nil around the delegate.
-rw-r--r--modules/undead-buffers.el16
-rw-r--r--tests/test-undead-buffers-kill-all-other-buffers-and-windows.el17
2 files changed, 28 insertions, 5 deletions
diff --git a/modules/undead-buffers.el b/modules/undead-buffers.el
index 21a04de9..e5b8dc00 100644
--- a/modules/undead-buffers.el
+++ b/modules/undead-buffers.el
@@ -96,7 +96,10 @@ Undead-buffers are buffers in `cj/undead-buffer-list'."
(let ((buf (current-buffer)))
(unless (one-window-p)
(delete-window))
- (cj/kill-buffer-or-bury-alive buf)))
+ ;; The delegate reads current-prefix-arg; a C-u meant for this wrapper
+ ;; must not flip it into add-to-undead-list mode.
+ (let ((current-prefix-arg nil))
+ (cj/kill-buffer-or-bury-alive buf))))
;; Keybinding moved to custom-buffer-file.el (C-; b k)
(defun cj/kill-other-window ()
@@ -109,7 +112,8 @@ window and acting would kill the buffer being viewed."
(other-window 1)
(let ((buf (current-buffer)))
(delete-window)
- (cj/kill-buffer-or-bury-alive buf)))
+ (let ((current-prefix-arg nil))
+ (cj/kill-buffer-or-bury-alive buf))))
(keymap-global-set "M-S-o" #'cj/kill-other-window)
(defun cj/kill-other-window-buffer ()
@@ -123,7 +127,8 @@ split is preserved. Buffers in `cj/undead-buffer-list' are buried."
(if (one-window-p)
(user-error "No other window")
(with-selected-window (next-window)
- (cj/kill-buffer-or-bury-alive (current-buffer)))))
+ (let ((current-prefix-arg nil))
+ (cj/kill-buffer-or-bury-alive (current-buffer))))))
;; Keybinding in custom-buffer-file.el (C-; b K)
(defun cj/kill-all-other-buffers-and-windows ()
@@ -131,8 +136,9 @@ split is preserved. Buffers in `cj/undead-buffer-list' are buried."
(interactive)
(save-some-buffers nil #'cj/undead-buffer-p)
(delete-other-windows)
- (mapc #'cj/kill-buffer-or-bury-alive
- (delq (current-buffer) (buffer-list))))
+ (let ((current-prefix-arg nil))
+ (mapc #'cj/kill-buffer-or-bury-alive
+ (delq (current-buffer) (buffer-list)))))
(keymap-global-set "M-S-m" #'cj/kill-all-other-buffers-and-windows) ;; was M-M
(provide 'undead-buffers)
diff --git a/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el b/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el
index 36d82add..bcb9f833 100644
--- a/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el
+++ b/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el
@@ -158,5 +158,22 @@
(kill-buffer buf))))))
(test-kill-all-other-buffers-and-windows-teardown)))
+(ert-deftest test-kill-all-other-buffers-and-windows-with-prefix-still-kills ()
+ "Boundary: C-u on the wrapper must still kill, not spam the undead list.
+The delegated cj/kill-buffer-or-bury-alive reads current-prefix-arg, so a
+prefixed wrapper call used to take the add-to-undead-list branch for every
+buffer -- nothing killed, list spammed."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((cj/undead-buffer-list cj/undead-buffer-list)
+ (buf (generate-new-buffer "*test-prefix-kill*")))
+ (unwind-protect
+ (let ((current-prefix-arg '(4)))
+ (cj/kill-all-other-buffers-and-windows)
+ (should-not (buffer-live-p buf))
+ (should-not (member "*test-prefix-kill*" cj/undead-buffer-list)))
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
(provide 'test-undead-buffers-kill-all-other-buffers-and-windows)
;;; test-undead-buffers-kill-all-other-buffers-and-windows.el ends here