summaryrefslogtreecommitdiff
path: root/lisp/progmodes/compile.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/progmodes/compile.el')
-rw-r--r--lisp/progmodes/compile.el64
1 files changed, 35 insertions, 29 deletions
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 269fbeaf137..d041fa366c8 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -1678,37 +1678,20 @@ displays at the top of the window; there is no arrow."
"Jump to an error corresponding to MSG at MK.
All arguments are markers. If END-MK is non-nil, mark is set there
and overlay is highlighted between MK and END-MK."
- (if (eq (window-buffer (selected-window))
- (marker-buffer msg))
- ;; If the compilation buffer window is selected,
- ;; keep the compilation buffer in this window;
- ;; display the source in another window.
- (let ((pop-up-windows t))
- (pop-to-buffer (marker-buffer mk)))
- (if (window-dedicated-p (selected-window))
- (pop-to-buffer (marker-buffer mk))
- (switch-to-buffer (marker-buffer mk))))
- ;; If narrowing gets in the way of going to the right place, widen.
- (unless (eq (goto-char mk) (point))
- (widen)
- (goto-char mk))
- (if end-mk
- (push-mark end-mk t)
- (if mark-active (setq mark-active)))
- ;; If hideshow got in the way of
- ;; seeing the right place, open permanently.
- (dolist (ov (overlays-at (point)))
- (when (eq 'hs (overlay-get ov 'invisible))
- (delete-overlay ov)
- (goto-char mk)))
-
;; Show compilation buffer in other window, scrolled to this error.
- (let* ((pop-up-windows t)
- ;; Use an existing window if it is in a visible frame.
+ (let* ((from-compilation-buffer (eq (window-buffer (selected-window))
+ (marker-buffer msg)))
+ ;; Use an existing window if it is in a visible frame.
(pre-existing (get-buffer-window (marker-buffer msg) 0))
- (w (let ((display-buffer-reuse-frames t))
- ;; Pop up a window.
- (display-buffer (marker-buffer msg))))
+ (w (if (and from-compilation-buffer pre-existing)
+ ;; Calling display-buffer here may end up (partly) hiding
+ ;; the error location if the two buffers are in two
+ ;; different frames. So don't do it if it's not necessary.
+ pre-existing
+ (let ((display-buffer-reuse-frames t)
+ (pop-up-windows t))
+ ;; Pop up a window.
+ (display-buffer (marker-buffer msg)))))
(highlight-regexp (with-current-buffer (marker-buffer msg)
;; also do this while we change buffer
(compilation-set-window w msg)
@@ -1718,6 +1701,29 @@ and overlay is highlighted between MK and END-MK."
;; creating a new window.
(unless pre-existing (compilation-set-window-height w))
+ (if from-compilation-buffer
+ ;; If the compilation buffer window was selected,
+ ;; keep the compilation buffer in this window;
+ ;; display the source in another window.
+ (let ((pop-up-windows t))
+ (pop-to-buffer (marker-buffer mk) 'other-window))
+ (if (window-dedicated-p (selected-window))
+ (pop-to-buffer (marker-buffer mk))
+ (switch-to-buffer (marker-buffer mk))))
+ ;; If narrowing gets in the way of going to the right place, widen.
+ (unless (eq (goto-char mk) (point))
+ (widen)
+ (goto-char mk))
+ (if end-mk
+ (push-mark end-mk t)
+ (if mark-active (setq mark-active)))
+ ;; If hideshow got in the way of
+ ;; seeing the right place, open permanently.
+ (dolist (ov (overlays-at (point)))
+ (when (eq 'hs (overlay-get ov 'invisible))
+ (delete-overlay ov)
+ (goto-char mk)))
+
(when highlight-regexp
(if (timerp next-error-highlight-timer)
(cancel-timer next-error-highlight-timer))