From: Leo Liu Date: Tue, 19 Nov 2013 02:34:04 +0000 (+0800) Subject: * window.el (display-buffer-alist, display-buffer): Document the X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~785 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f130cb76b8ebe4f57c764064122d06f525a65d22;p=emacs.git * window.el (display-buffer-alist, display-buffer): Document the new parameter no-display-ok. * progmodes/compile.el (compilation-start) (compilation-goto-locus, compilation-find-file): Pass no-display-ok and handle nil value from display-buffer. Fixes: debbugs:13594 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f0ea7a93526..c327727d3e9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2013-11-19 Leo Liu + + * progmodes/compile.el (compilation-start) + (compilation-goto-locus, compilation-find-file): Pass + no-display-ok and handle nil value from display-buffer. + (Bug#13594) + + * window.el (display-buffer-alist, display-buffer): Document the + new parameter no-display-ok. + 2013-11-18 Stefan Monnier * electric.el (electric-indent-mode-map): Remove. diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 54f03728524..58f14f68658 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -1632,7 +1632,7 @@ Returns the compilation buffer created." (set-buffer-modified-p nil)) ;; Pop up the compilation buffer. ;; http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01638.html - (setq outwin (display-buffer outbuf)) + (setq outwin (display-buffer outbuf '(nil (no-display-ok . t)))) (with-current-buffer outbuf (let ((process-environment (append @@ -1654,7 +1654,7 @@ Returns the compilation buffer created." (list command mode name-function highlight-regexp)) (set (make-local-variable 'revert-buffer-function) 'compilation-revert-buffer) - (set-window-start outwin (point-min)) + (and outwin (set-window-start outwin (point-min))) ;; Position point as the user will see it. (let ((desired-visible-point @@ -1663,15 +1663,15 @@ Returns the compilation buffer created." (point-max) ;; Normally put it at the top. (point-min)))) - (if (eq outwin (selected-window)) - (goto-char desired-visible-point) + (goto-char desired-visible-point) + (when (and outwin (not (eq outwin (selected-window)))) (set-window-point outwin desired-visible-point))) ;; The setup function is called before compilation-set-window-height ;; so it can set the compilation-window-height buffer locally. (if compilation-process-setup-function (funcall compilation-process-setup-function)) - (compilation-set-window-height outwin) + (and outwin (compilation-set-window-height outwin)) ;; Start the compilation. (if (fboundp 'start-process) (let ((proc @@ -2513,14 +2513,16 @@ and overlay is highlighted between MK and END-MK." ;; the error location if the two buffers are in two ;; different frames. So don't do it if it's not necessary. pre-existing - (display-buffer (marker-buffer msg)))) + (display-buffer (marker-buffer msg) '(nil (no-display-ok . t))))) (highlight-regexp (with-current-buffer (marker-buffer msg) ;; also do this while we change buffer - (compilation-set-window w msg) + (goto-char (marker-position msg)) + (and w (compilation-set-window w msg)) compilation-highlight-regexp))) ;; Ideally, the window-size should be passed to `display-buffer' ;; so it's only used when creating a new window. - (unless pre-existing (compilation-set-window-height w)) + (when (and (not pre-existing) w) + (compilation-set-window-height w)) (if from-compilation-buffer ;; If the compilation buffer window was selected, @@ -2631,9 +2633,12 @@ attempts to find a file whose name is produced by (format FMT FILENAME)." (while (null buffer) ;Repeat until the user selects an existing file. ;; The file doesn't exist. Ask the user where to find it. (save-excursion ;This save-excursion is probably not right. - (let ((pop-up-windows t)) - (compilation-set-window (display-buffer (marker-buffer marker)) - marker) + (let ((w (let ((pop-up-windows t)) + (display-buffer (marker-buffer marker) + '(nil (no-display-ok . t)))))) + (with-current-buffer (marker-buffer marker) + (goto-char marker) + (and w (compilation-set-window w marker))) (let* ((name (read-file-name (format "Find this %s in (default %s): " compilation-error filename) diff --git a/lisp/window.el b/lisp/window.el index 07741c74a84..ad74afed027 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -5355,7 +5355,10 @@ This is a list of elements (CONDITION . ACTION), where: ACTION is a cons cell (FUNCTION . ALIST), where FUNCTION is a function or a list of functions. Each such function should accept two arguments: a buffer to display and an alist of the - same form as ALIST. See `display-buffer' for details. + same form as ALIST. If (no-display-ok . t) is in ALIST, the + caller is prepared for the case of not displaying the buffer + and FUNCTION can safely return a non-window value to suppress + displaying. See `display-buffer' for details. `display-buffer' scans this alist until it either finds a matching regular expression or the function specified by a @@ -5439,9 +5442,10 @@ where FUNCTION is either a function or a list of functions, and ALIST is an arbitrary association list (alist). Each such FUNCTION should accept two arguments: the buffer to -display and an alist. Based on those arguments, it should either -display the buffer and return the window, or return nil if unable -to display the buffer. +display and an alist. Based on those arguments, it should +display the buffer and return the window. If the caller is +prepared to handle the case of not displaying the buffer it +should pass (no-display-ok . t) as an element of the ALIST. The `display-buffer' function builds a function list and an alist by combining the functions and alists specified in @@ -5542,7 +5546,7 @@ argument, ACTION is t." (while (and functions (not window)) (setq window (funcall (car functions) buffer alist) functions (cdr functions))) - window)))) + (and (windowp window) window))))) (defun display-buffer-other-frame (buffer) "Display buffer BUFFER preferably in another frame.