]> code.delx.au - gnu-emacs/commitdiff
* lisp/window.el (with-displayed-buffer-window): New macro.
authorJuri Linkov <juri@jurta.org>
Tue, 8 Jul 2014 08:02:50 +0000 (11:02 +0300)
committerJuri Linkov <juri@jurta.org>
Tue, 8 Jul 2014 08:02:50 +0000 (11:02 +0300)
(with-temp-buffer-window, with-current-buffer-window):
Use `macroexp-let2' to evaluate and bind variables
in the same order as macro arguments.
(display-buffer--action-function-custom-type): Add
`display-buffer-below-selected' and `display-buffer-at-bottom'.

* lisp/minibuffer.el (minibuffer-completion-help): Replace
`with-output-to-temp-buffer' with `with-displayed-buffer-window'
with actions that display *Completions* at-bottom when called
from the minibuffer, or below-selected in a normal buffer.
Associate `window-height' with `fit-window-to-buffer'.
Let-bind `pop-up-windows' to nil.

* lisp/dired.el (dired-mark-pop-up): Use `with-displayed-buffer-window'
instead of `with-current-buffer-window'.

Fixes: debbugs:17809
lisp/ChangeLog
lisp/dired.el
lisp/minibuffer.el
lisp/window.el

index a8b5f935d9aae312f12bb02ca9ff5fdcd683abbd..cc864810c8c9be6c6d7ca3ef5f442ca36868a93f 100644 (file)
@@ -1,3 +1,22 @@
+2014-07-08  Juri Linkov  <juri@jurta.org>
+
+       * window.el (with-displayed-buffer-window): New macro.
+       (with-temp-buffer-window, with-current-buffer-window):
+       Use `macroexp-let2' to evaluate and bind variables
+       in the same order as macro arguments.
+       (display-buffer--action-function-custom-type): Add
+       `display-buffer-below-selected' and `display-buffer-at-bottom'.
+
+       * minibuffer.el (minibuffer-completion-help): Replace
+       `with-output-to-temp-buffer' with `with-displayed-buffer-window'
+       with actions that display *Completions* at-bottom when called
+       from the minibuffer, or below-selected in a normal buffer.
+       Associate `window-height' with `fit-window-to-buffer'.
+       Let-bind `pop-up-windows' to nil.
+
+       * dired.el (dired-mark-pop-up): Use `with-displayed-buffer-window'
+       instead of `with-current-buffer-window'.  (Bug#17809)
+
 2014-07-07  Luke Lee  <luke.yx.lee@gmail.com>
 
        * progmodes/hideif.el (hide-ifdef-env): Change to global.
index a241fb3b339451698fef5fcdafd5cdf9ed03d3b9..25b70219c7d77e91d015d596ecd56d3cedf957a2 100644 (file)
@@ -3103,20 +3103,20 @@ argument or confirmation)."
          ;; Mark *Marked Files* window as softly-dedicated, to prevent
          ;; other buffers e.g. *Completions* from reusing it (bug#17554).
          (display-buffer-mark-dedicated 'soft))
-      (with-current-buffer buffer
-       (with-current-buffer-window
-        buffer
-        (cons 'display-buffer-below-selected
-              '((window-height . fit-window-to-buffer)))
-        #'(lambda (window _value)
-            (with-selected-window window
-              (unwind-protect
-                  (apply function args)
-                (when (window-live-p window)
-                  (quit-restore-window window 'kill)))))
-        ;; Handle (t FILE) just like (FILE), here.  That value is
-        ;; used (only in some cases), to mean just one file that was
-        ;; marked, rather than the current line file.
+      (with-displayed-buffer-window
+       buffer
+       (cons 'display-buffer-below-selected
+            '((window-height . fit-window-to-buffer)))
+       #'(lambda (window _value)
+          (with-selected-window window
+            (unwind-protect
+                (apply function args)
+              (when (window-live-p window)
+                (quit-restore-window window 'kill)))))
+       ;; Handle (t FILE) just like (FILE), here.  That value is
+       ;; used (only in some cases), to mean just one file that was
+       ;; marked, rather than the current line file.
+       (with-current-buffer buffer
         (dired-format-columns-of-files
          (if (eq (car files) t) (cdr files) files))
         (remove-text-properties (point-min) (point-max)
index e7e08342b477b433352bf044a0b545b00f449e5a..f8b77cddbc57c25be88f41e2d985d67628ad94e7 100644 (file)
@@ -1794,8 +1794,29 @@ variables.")
              ;; 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*"
+             (display-buffer-mark-dedicated 'soft)
+             ;; Disable `pop-up-windows' temporarily to allow
+             ;; `display-buffer--maybe-pop-up-frame-or-window'
+             ;; in the display actions below to pop up a frame
+             ;; if `pop-up-frames' is non-nil, but not to pop up a window.
+             (pop-up-windows nil))
+        (with-displayed-buffer-window
+          "*Completions*"
+          ;; This is a copy of `display-buffer-fallback-action'
+          ;; where `display-buffer-use-some-window' is replaced
+          ;; with `display-buffer-at-bottom'.
+          `((display-buffer--maybe-same-window
+             display-buffer-reuse-window
+             display-buffer--maybe-pop-up-frame-or-window
+             ;; Use `display-buffer-below-selected' for inline completions,
+             ;; but not in the minibuffer (e.g. in `eval-expression')
+             ;; for which `display-buffer-at-bottom' is used.
+             ,(if (and completion-in-region-mode-predicate
+                       (not (minibuffer-selected-window)))
+                  'display-buffer-below-selected
+                'display-buffer-at-bottom))
+            (window-height . fit-window-to-buffer))
+          nil
           ;; Remove the base-size tail because `sort' requires a properly
           ;; nil-terminated list.
           (when last (setcdr last nil))
index 28dd6a8ab2660114925a87a1aab7c01036b2eb12..e1c7965977399eb2ce7f2f7ee633123124ceb03e 100644 (file)
@@ -185,16 +185,19 @@ argument replaces this)."
   (let ((buffer (make-symbol "buffer"))
        (window (make-symbol "window"))
        (value (make-symbol "value")))
-    `(let* ((,buffer (temp-buffer-window-setup ,buffer-or-name))
-           (standard-output ,buffer)
-           ,window ,value)
-       (setq ,value (progn ,@body))
-       (with-current-buffer ,buffer
-        (setq ,window (temp-buffer-window-show ,buffer ,action)))
-
-       (if (functionp ,quit-function)
-          (funcall ,quit-function ,window ,value)
-        ,value))))
+    (macroexp-let2 nil vbuffer-or-name buffer-or-name
+      (macroexp-let2 nil vaction action
+       (macroexp-let2 nil vquit-function quit-function
+         `(let* ((,buffer (temp-buffer-window-setup ,vbuffer-or-name))
+                 (standard-output ,buffer)
+                 ,window ,value)
+            (setq ,value (progn ,@body))
+            (with-current-buffer ,buffer
+              (setq ,window (temp-buffer-window-show ,buffer ,vaction)))
+
+            (if (functionp ,vquit-function)
+                (funcall ,vquit-function ,window ,value)
+              ,value)))))))
 
 (defmacro with-current-buffer-window (buffer-or-name action quit-function &rest body)
   "Evaluate BODY with a buffer BUFFER-OR-NAME current and show that buffer.
@@ -205,16 +208,50 @@ BODY."
   (let ((buffer (make-symbol "buffer"))
        (window (make-symbol "window"))
        (value (make-symbol "value")))
-    `(let* ((,buffer (temp-buffer-window-setup ,buffer-or-name))
-           (standard-output ,buffer)
-           ,window ,value)
-       (with-current-buffer ,buffer
-        (setq ,value (progn ,@body))
-        (setq ,window (temp-buffer-window-show ,buffer ,action)))
+    (macroexp-let2 nil vbuffer-or-name buffer-or-name
+      (macroexp-let2 nil vaction action
+       (macroexp-let2 nil vquit-function quit-function
+         `(let* ((,buffer (temp-buffer-window-setup ,vbuffer-or-name))
+                 (standard-output ,buffer)
+                 ,window ,value)
+            (with-current-buffer ,buffer
+              (setq ,value (progn ,@body))
+              (setq ,window (temp-buffer-window-show ,buffer ,vaction)))
+
+            (if (functionp ,vquit-function)
+                (funcall ,vquit-function ,window ,value)
+              ,value)))))))
+
+(defmacro with-displayed-buffer-window (buffer-or-name action quit-function &rest body)
+  "Show a buffer BUFFER-OR-NAME and evaluate BODY in that buffer.
+This construct is like `with-current-buffer-window' but unlike that
+displays the buffer specified by BUFFER-OR-NAME before running BODY."
+  (declare (debug t))
+  (let ((buffer (make-symbol "buffer"))
+       (window (make-symbol "window"))
+       (value (make-symbol "value")))
+    (macroexp-let2 nil vbuffer-or-name buffer-or-name
+      (macroexp-let2 nil vaction action
+       (macroexp-let2 nil vquit-function quit-function
+         `(let* ((,buffer (temp-buffer-window-setup ,vbuffer-or-name))
+                 (standard-output ,buffer)
+                 ,window ,value)
+            (with-current-buffer ,buffer
+              (setq ,window (temp-buffer-window-show ,buffer ,vaction)))
+
+            (let ((inhibit-read-only t)
+                  (inhibit-modification-hooks t))
+              (setq ,value (progn ,@body)))
+
+            (set-window-point ,window (point-min))
+
+            (when (functionp (cdr (assq 'window-height (cdr ,vaction))))
+              (ignore-errors
+                (funcall (cdr (assq 'window-height (cdr ,vaction))) ,window)))
 
-       (if (functionp ,quit-function)
-          (funcall ,quit-function ,window ,value)
-        ,value))))
+            (if (functionp ,vquit-function)
+                (funcall ,vquit-function ,window ,value)
+              ,value)))))))
 
 ;; The following two functions are like `window-next-sibling' and
 ;; `window-prev-sibling' but the WINDOW argument is _not_ optional (so
@@ -5980,6 +6017,8 @@ The actual non-nil value of this variable will be copied to the
           (const display-buffer-pop-up-window)
           (const display-buffer-same-window)
           (const display-buffer-pop-up-frame)
+          (const display-buffer-below-selected)
+          (const display-buffer-at-bottom)
           (const display-buffer-in-previous-window)
           (const display-buffer-use-some-window)
           (function :tag "Other function"))