diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 1eef0ed2605..592eb7b0c13 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -664,7 +664,7 @@ other kinds of prefix arguments are ignored." (next-error 1)) -(defun compilation-buffer-p (buffer) +(defsubst compilation-buffer-p (buffer) (assq 'compilation-error-list (buffer-local-variables buffer))) ;; Return a compilation buffer. @@ -724,7 +724,9 @@ See variables `compilation-parse-errors-function' and ;; We want to pass a number here only if ;; we got a numeric prefix arg, not just C-u. (and (not (consp argp)) - (1- (prefix-numeric-value argp)))) + (if (< (prefix-numeric-value argp) 1) + 0 + (1- (prefix-numeric-value argp))))) ;; Make ARGP nil if the prefix arg was just C-u, ;; since that means to reparse the errors, which the ;; compile-reinitialize-errors call just did. @@ -735,8 +737,21 @@ See variables `compilation-parse-errors-function' and (save-excursion (set-buffer compilation-last-buffer) ;; compilation-error-list points to the "current" error. - (setq next-errors (nthcdr (1- (prefix-numeric-value argp)) - compilation-error-list) + (setq next-errors + (if (> (prefix-numeric-value argp) 0) + (nthcdr (1- (prefix-numeric-value argp)) + compilation-error-list) + ;; Zero or negative arg; we need to move back in the list. + (let ((n (1- (prefix-numeric-value argp))) + (i 0) + (e compilation-old-error-list)) + ;; See how many cdrs away the current error is from the start. + (while (not (eq e compilation-error-list)) + (setq i (1+ i) + e (cdr e))) + (if (> (- n) i) + (error "Moved back past first error") + (nthcdr (+ i n) compilation-old-error-list)))) next-error (car next-errors)) (while (progn