From 027da652a4fc643a086a880aec30618b2bccb487 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 12 Feb 2020 21:39:44 +0200 Subject: Fix display of minibuffer prompt in ido.el * lisp/minibuffer.el (minibuffer--message-overlay-pos): New function. (set-minibuffer-message): Use it to determine where to show the overlay with the temporary message. * lisp/ido.el (ido-exhibit): Revert "Render Ido suggestions using an overlay"; this restores the original code which inserted the match-status information into the minibuffer, instead of displaying it in an overlay with an after-string. Put the special 'minibuffer-message' text property at the beginning of the inserted text. (Bug#39379) * etc/NEWS: * doc/lispref/display.texi (Displaying Messages): * doc/lispref/text.texi (Special Properties): Document the 'minibuffer-message' text property and its effect. --- lisp/ido.el | 19 +++++++------------ lisp/minibuffer.el | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 14 deletions(-) (limited to 'lisp') diff --git a/lisp/ido.el b/lisp/ido.el index 6707d814077..7198649e5a5 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -4492,8 +4492,6 @@ For details of keybindings, see `ido-find-file'." (ido-tidy)) (throw 'ido contents)))) -(defvar ido--overlay nil) - (defun ido-exhibit () "Post command hook for Ido." ;; Find matching files and display a list in the minibuffer. @@ -4728,16 +4726,13 @@ For details of keybindings, see `ido-find-file'." (let ((inf (ido-completions contents))) (setq ido-show-confirm-message nil) (ido-trace "inf" inf) - (when ido--overlay - (delete-overlay ido--overlay)) - (let ((o (make-overlay (point-max) (point-max) nil t t))) - (when (> (length inf) 0) - ;; For hacks that redefine ido-completions function (bug#39379) - (when (eq (aref inf 0) ?\n) - (setq inf (concat " " inf))) - (put-text-property 0 1 'cursor t inf)) - (overlay-put o 'after-string inf) - (setq ido--overlay o))) + (let ((pos (point))) + (insert inf) + (if (< pos (point-max)) + ;; Tell set-minibuffer-message where to display the + ;; overlay with temporary messages. + (put-text-property pos (1+ pos) 'minibuffer-message t))) + ) )))) (defun ido-completions (name) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 0589211877a..49daabc44e3 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -763,8 +763,21 @@ and `clear-minibuffer-message' called automatically via (defvar minibuffer-message-timer nil) (defvar minibuffer-message-overlay nil) +(defun minibuffer--message-overlay-pos () + "Return position where `set-minibuffer-message' shall put message overlay." + ;; Starting from point, look for non-nil 'minibuffer-message' + ;; property, and return its position. If none found, return the EOB + ;; position. + (let* ((pt (point)) + (propval (get-text-property pt 'minibuffer-message))) + (if propval pt + (next-single-property-change pt 'minibuffer-message nil (point-max))))) + (defun set-minibuffer-message (message) "Temporarily display MESSAGE at the end of the minibuffer. +If some part of the minibuffer text has the `minibuffer-message' property, +the message will be displayed before the first such character, instead of +at the end of the minibuffer. The text is displayed for `minibuffer-message-clear-timeout' seconds \(if the value is a number), or until the next input event arrives, whichever comes first. @@ -784,8 +797,9 @@ via `set-message-function'." (clear-minibuffer-message) - (setq minibuffer-message-overlay - (make-overlay (point-max) (point-max) nil t t)) + (let ((ovpos (minibuffer--message-overlay-pos))) + (setq minibuffer-message-overlay + (make-overlay ovpos ovpos nil t t))) (unless (zerop (length message)) ;; The current C cursor code doesn't know to use the overlay's ;; marker's stickiness to figure out whether to place the cursor -- cgit v1.2.1