From e51e43b7046b56c58310854182a1d589ee4c770c Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 17 May 2023 19:48:02 -0700 Subject: [PATCH] Fix buffer-mismatch bug in erc-scroll-to-bottom * lisp/erc/erc-goodies.el (erc-scroll-to-bottom): Only `recenter' when the selected window's buffer is current. Previously, the module `scrolltobottom' signaled an "Error in `post-command-hook'" when a user clicked a channel indicator in the mode line from a window showing another ERC buffer. * lisp/erc/erc-track.el (erc-track--switch-fallback-blockers): New internal variable used by `erc-track--switch-buffer' in deciding whether to set `erc-track-last-non-erc-buffer' to the current buffer. (erc-track--switch-buffer): Consult list of `buffer-match-p' conditions in `erc-track--switch-fallback-blockers' to decide whether to set `erc-track-last-non-erc-buffer' to the current buffer. (Bug#63595) --- lisp/erc/erc-goodies.el | 1 + lisp/erc/erc-track.el | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el index afc05148506..96083de2c22 100644 --- a/lisp/erc/erc-goodies.el +++ b/lisp/erc/erc-goodies.el @@ -91,6 +91,7 @@ variable `erc-input-line-position'." (save-restriction (widen) (when (and erc-insert-marker + (eq (current-buffer) (window-buffer)) ;; we're editing a line. Scroll. (> (point) erc-insert-marker)) (save-excursion diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el index 8101183ce3d..64e59a90047 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -923,13 +923,20 @@ is relative to `erc-track-switch-direction'." (setq offset 0))) (car (nth offset erc-modified-channels-alist)))) +(defvar erc-track--switch-fallback-blockers '((derived-mode . erc-mode)) + "List of `buffer-match-p' conditions OR'd together. +ERC sets `erc-track-last-non-erc-buffer' to the current buffer +unless any passes.") + (defun erc-track--switch-buffer (fun arg) (if (not erc-track-mode) (message (concat "Enable the ERC track module if you want to use the" " tracking minor mode")) (cond (erc-modified-channels-alist ;; if we're not in erc-mode, set this buffer to return to - (unless (eq major-mode 'erc-mode) + (unless (buffer-match-p (cons 'or + erc-track--switch-fallback-blockers) + (current-buffer)) (setq erc-track-last-non-erc-buffer (current-buffer))) ;; and jump to the next active channel (if-let ((buf (erc-track-get-active-buffer arg)) -- 2.39.2