1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-04 11:40:22 +00:00

Allow running several commands in compilation-start

* lisp/progmodes/compile.el (compilation-start): Allow not erasing
the contents of the buffer (bug#28892).
This commit is contained in:
Lars Ingebrigtsen 2022-05-17 22:07:27 +02:00
parent 89ca98c59c
commit 092aea9a27

View File

@ -1813,7 +1813,8 @@ If nil, don't hide anything."
(unless compilation-in-progress (force-mode-line-update t)))
;;;###autoload
(defun compilation-start (command &optional mode name-function highlight-regexp)
(defun compilation-start (command &optional mode name-function highlight-regexp
continue)
"Run compilation command COMMAND (low level interface).
If COMMAND starts with a cd command, that becomes the `default-directory'.
The rest of the arguments are optional; for them, nil means use the default.
@ -1830,6 +1831,12 @@ If HIGHLIGHT-REGEXP is non-nil, `next-error' will temporarily highlight
the matching section of the visited source line; the default is to use the
global value of `compilation-highlight-regexp'.
If CONTINUE is non-nil, the buffer won't be emptied before
compilation is started. This can be useful if you wish to
combine the output from several compilation commands in the same
buffer. The new output will be at the end of the buffer, and
point is not changed.
Returns the compilation buffer created."
(or mode (setq mode 'compilation-mode))
(let* ((name-of-mode
@ -1893,7 +1900,12 @@ Returns the compilation buffer created."
(if (= (length expanded-dir) 1)
(car expanded-dir)
substituted-dir)))))
(erase-buffer)
(if continue
(progn
;; Save the point so we can restore it.
(setq continue (point))
(goto-char (point-max)))
(erase-buffer))
;; Select the desired mode.
(if (not (eq mode t))
(progn
@ -1919,12 +1931,13 @@ Returns the compilation buffer created."
(if (or compilation-auto-jump-to-first-error
(eq compilation-scroll-output 'first-error))
(setq-local compilation-auto-jump-to-next t))
;; Output a mode setter, for saving and later reloading this buffer.
(insert "-*- mode: " name-of-mode
"; default-directory: "
(prin1-to-string (abbreviate-file-name default-directory))
" -*-\n"
(format "%s started at %s\n\n"
(when (zerop (buffer-size))
;; Output a mode setter, for saving and later reloading this buffer.
(insert "-*- mode: " name-of-mode
"; default-directory: "
(prin1-to-string (abbreviate-file-name default-directory))
" -*-\n"))
(insert (format "%s started at %s\n\n"
mode-name
(substring (current-time-string) 0 19))
command "\n")
@ -1947,24 +1960,26 @@ Returns the compilation buffer created."
(setq-local compilation-arguments
(list command mode name-function highlight-regexp))
(setq-local revert-buffer-function 'compilation-revert-buffer)
(and outwin
;; Forcing the window-start overrides the usual redisplay
;; feature of bringing point into view, so setting the
;; window-start to top of the buffer risks losing the
;; effect of moving point to EOB below, per
;; compilation-scroll-output, if the command is long
;; enough to push point outside of the window. This
;; could happen, e.g., in `rgrep'.
(not compilation-scroll-output)
(set-window-start outwin (point-min)))
(when (and outwin
(not continue)
;; Forcing the window-start overrides the usual redisplay
;; feature of bringing point into view, so setting the
;; window-start to top of the buffer risks losing the
;; effect of moving point to EOB below, per
;; compilation-scroll-output, if the command is long
;; enough to push point outside of the window. This
;; could happen, e.g., in `rgrep'.
(not compilation-scroll-output))
(set-window-start outwin (point-min)))
;; Position point as the user will see it.
(let ((desired-visible-point
;; Put it at the end if `compilation-scroll-output' is set.
(if compilation-scroll-output
(point-max)
;; Normally put it at the top.
(point-min))))
(cond
(continue continue)
;; Put it at the end if `compilation-scroll-output' is set.
(compilation-scroll-output (point-max))
;; Normally put it at the top.
(t (point-min)))))
(goto-char desired-visible-point)
(when (and outwin (not (eq outwin (selected-window))))
(set-window-point outwin desired-visible-point)))