Subject: bug#46119: 28.0.50; this-error-recenter

From: Tino Calancha <[email-masked]>
Date: Wed, 03 Feb 2021 14:03:09 +0100

Juri Linkov <[email-masked]> writes:

> Would it be possible to avoid code duplication between
> next-error-no-select and recenter-current-error?

How about adding this macro?

(defmacro with-selected-locus (n &rest body)
  "Visit the Nth error and execute BODY, then select the previously selected window."
  (declare (indent 1) (debug (form body)))
  `(save-selected-window
     (let ((next-error-highlight next-error-highlight-no-select)
           (display-buffer-overriding-action
            '(nil (inhibit-same-window . t))))
       (next-error ,n)
       ,@body)))

(defun next-error-no-select (&optional n)
  "Move point to the next error in the `next-error' buffer and highlight match.
Prefix arg N says how many error messages to move forwards (or
backwards, if negative).
Finds and highlights the source line like \\[next-error], but does not
select the source buffer."
  (interactive "p")
  (with-selected-locus n))

(defun recenter-current-error (&optional arg)
  "Recenter the current displayed error in the `next-error' buffer."
  (interactive "P")
  (with-selected-locus 0
    (set-buffer (window-buffer))
    (recenter-top-bottom arg)))