Function: rmail-next-error-move
rmail-next-error-move is a byte-compiled function defined in
rmail.el.gz.
Signature
(rmail-next-error-move MSG-POS BAD-MARKER)
Documentation
Move to an error locus (probably grep hit) in an Rmail buffer.
MSG-POS is a marker pointing at the error message in the grep buffer. BAD-MARKER is a marker that ought to point at where to move to, but probably is garbage.
Source Code
;; Defined in /usr/src/emacs/lisp/mail/rmail.el.gz
(defun rmail-next-error-move (msg-pos _bad-marker)
"Move to an error locus (probably grep hit) in an Rmail buffer.
MSG-POS is a marker pointing at the error message in the grep buffer.
BAD-MARKER is a marker that ought to point at where to move to,
but probably is garbage."
(let* ((message-loc (compilation--message->loc
(get-text-property msg-pos 'compilation-message
(marker-buffer msg-pos))))
(column (car message-loc))
(linenum (cadr message-loc))
line-text
pos
msgnum msgbeg msgend
header-field
line-number-within)
;; Look at the whole Rmail file.
(rmail-swap-buffers-maybe)
(save-restriction
(widen)
(save-excursion
;; Find the line that the error message points at.
(goto-char (point-min))
(forward-line (1- linenum))
(setq pos (point))
;; Find the text at the start of the line,
;; before the first = sign.
;; This text has a good chance of being also in the
;; decoded message.
(save-excursion
(skip-chars-forward "^=\n")
(setq line-text (buffer-substring pos (point))))
;; Find which message this position is in,
;; and the limits of that message.
(setq msgnum (rmail-what-message pos))
(setq msgbeg (rmail-msgbeg msgnum))
(setq msgend (rmail-msgend msgnum))
;; Find which header this locus is in,
;; or if it's in the message body,
;; and the line-based position within that.
(goto-char msgbeg)
(let ((header-end msgend))
(if (search-forward "\n\n" nil t)
(setq header-end (point)))
(if (>= pos header-end)
(setq line-number-within
(count-lines header-end pos))
(goto-char pos)
(unless (looking-at "^[^ \t]")
(re-search-backward "^[^ \t]"))
(looking-at "[^:\n]*[:\n]")
(setq header-field (match-string 0)
line-number-within (count-lines (point) pos))))))
;; Display the right message.
(rmail-show-message msgnum)
;; Move to the right position within the displayed message.
;; Or at least try. The decoded message's lines may not
;; correspond to the lines in the inbox file.
(goto-char (point-min))
(if header-field
(progn
(re-search-forward (concat "^" (regexp-quote header-field)) nil t)
(forward-line line-number-within))
(search-forward "\n\n" nil t)
(if (re-search-forward (concat "^" (regexp-quote line-text)) nil t)
(goto-char (match-beginning 0))))
(if (eobp)
;; If the decoded message doesn't have enough lines,
;; go to the beginning rather than the end.
(goto-char (point-min))
;; Otherwise, go to the right column.
(if column
(forward-char column)))))