# HG changeset patch # User Stefan Monnier # Date 1258668340 0 # Node ID 57f23ca20a76cf9aaa89717ef618840b184d2c61 # Parent aef9a4af60246f9bafff9d3fc45d003e65743302 * window.el (display-buffer-mark-dedicated): New var. (display-buffer): Obey it. * minibuffer.el (minibuffer-completion-help): Use it. diff -r aef9a4af6024 -r 57f23ca20a76 lisp/ChangeLog --- a/lisp/ChangeLog Thu Nov 19 22:03:36 2009 +0000 +++ b/lisp/ChangeLog Thu Nov 19 22:05:40 2009 +0000 @@ -1,5 +1,9 @@ 2009-11-19 Stefan Monnier + * window.el (display-buffer-mark-dedicated): New var. + (display-buffer): Obey it. + * minibuffer.el (minibuffer-completion-help): Use it. + * progmodes/sym-comp.el (symbol-complete): Use completion-in-region. * filecache.el (file-cache-add-file): Use push and cons. diff -r aef9a4af6024 -r 57f23ca20a76 lisp/minibuffer.el --- a/lisp/minibuffer.el Thu Nov 19 22:03:36 2009 +0000 +++ b/lisp/minibuffer.el Thu Nov 19 22:05:40 2009 +0000 @@ -1004,9 +1004,14 @@ (if (and completions (or (consp (cdr completions)) (not (equal (car completions) string)))) - (with-output-to-temp-buffer "*Completions*" - (let* ((last (last completions)) - (base-size (cdr last))) + (let* ((last (last completions)) + (base-size (cdr last)) + ;; If the *Completions* buffer is shown in a new + ;; window, mark it as softly-dedicated, so bury-buffer in + ;; minibuffer-hide-completions will know whether to + ;; delete the window or not. + (display-buffer-mark-dedicated 'soft)) + (with-output-to-temp-buffer "*Completions*" ;; Remove the base-size tail because `sort' requires a properly ;; nil-terminated list. (when last (setcdr last nil)) @@ -1019,11 +1024,11 @@ (if ann (list s ann) s))) completions))) (with-current-buffer standard-output - (set (make-local-variable 'completion-base-position) - ;; FIXME: We should provide the END part as well, but - ;; currently completion-all-completions does not give - ;; us the necessary information. - (list (+ start base-size) nil))) + (set (make-local-variable 'completion-base-position) + ;; FIXME: We should provide the END part as well, but + ;; currently completion-all-completions does not give + ;; us the necessary information. + (list (+ start base-size) nil))) (display-completion-list completions))) ;; If there are no completions, or if the current input is already the diff -r aef9a4af6024 -r 57f23ca20a76 lisp/window.el --- a/lisp/window.el Thu Nov 19 22:03:36 2009 +0000 +++ b/lisp/window.el Thu Nov 19 22:05:40 2009 +0000 @@ -1042,6 +1042,11 @@ (set-window-buffer window buffer) (window--display-buffer-1 window))) +(defvar display-buffer-mark-dedicated nil + "If non-nil, `display-buffer' marks the windows it creates as dedicated. +The actual non-nil value of this variable will be copied to the +`window-dedicated-p' flag.") + (defun display-buffer (buffer-or-name &optional not-this-window frame) "Make buffer BUFFER-OR-NAME appear in some window but don't select it. BUFFER-OR-NAME must be a buffer or the name of an existing @@ -1133,8 +1138,10 @@ buffer (if (listp pars) pars)))))) ((or use-pop-up-frames (not frame-to-use)) ;; We want or need a new frame. - (window--display-buffer-2 - buffer (frame-selected-window (funcall pop-up-frame-function)))) + (let ((win (frame-selected-window (funcall pop-up-frame-function)))) + (when display-buffer-mark-dedicated + (set-window-dedicated-p win display-buffer-mark-dedicated)) + (window--display-buffer-2 buffer win))) ((and pop-up-windows ;; Make a new window. (or (not (frame-parameter frame-to-use 'unsplittable)) @@ -1149,8 +1156,10 @@ (or (window--try-to-split-window (get-largest-window frame-to-use t)) (window--try-to-split-window - (get-lru-window frame-to-use t)))) - (window--display-buffer-2 buffer window-to-use))) + (get-lru-window frame-to-use t))))) + (when display-buffer-mark-dedicated + (set-window-dedicated-p window-to-use display-buffer-mark-dedicated)) + (window--display-buffer-2 buffer window-to-use)) ((let ((window-to-undedicate ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate ;; the selected window to its buffer, to avoid that some of