emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 e338a8ac41d: Handle point not at EOB in minibuffer-choose-compl


From: Eli Zaretskii
Subject: emacs-29 e338a8ac41d: Handle point not at EOB in minibuffer-choose-completion
Date: Tue, 2 May 2023 13:55:15 -0400 (EDT)

branch: emacs-29
commit e338a8ac41d4a9fd798dda90275abe75ac071335
Author: Spencer Baugh <sbaugh@catern.com>
Commit: Eli Zaretskii <eliz@gnu.org>

    Handle point not at EOB in minibuffer-choose-completion
    
    Without this change, only the minibuffer contents before point
    are cleared when a completion is chosen, which results in stray
    text when point is in the middle of the minibuffer.
    
    After this change, we heuristically decide either to clear the
    whole buffer or only part of it, taking into account the
    location of point.
    
    This is a backport for the Emacs 29 release branch of a simpler
    fix in minibuffer-completion-help.
    
    * lisp/minibuffer.el (minibuffer-next-completion):
    (minibuffer-choose-completion):
    Recalculate completion-base-affixes with point.  (Bug#62700)
---
 lisp/minibuffer.el | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index be91987d635..747c9443afa 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -4480,13 +4480,25 @@ selected by these commands to the minibuffer."
 When `minibuffer-completion-auto-choose' is non-nil, then also
 insert the selected completion to the minibuffer."
   (interactive "p")
-  (let ((auto-choose minibuffer-completion-auto-choose))
+  (let ((auto-choose minibuffer-completion-auto-choose)
+         (buf (current-buffer)))
     (with-minibuffer-completions-window
       (when completions-highlight-face
         (setq-local cursor-face-highlight-nonselected-window t))
       (next-completion (or n 1))
       (when auto-choose
-        (let ((completion-use-base-affixes t))
+        (let* ((completion-use-base-affixes t)
+               ;; Backported fix for bug#62700
+               (md
+                (with-current-buffer buf
+                  (completion--field-metadata 
(minibuffer--completion-prompt-end))))
+               (base-suffix
+                (if (eq (alist-get 'category (cdr md)) 'file)
+                    (with-current-buffer buf
+                      (buffer-substring (save-excursion (search-forward "/" 
nil t) (point))
+                                        (point-max)))
+                  ""))
+              (completion-base-affixes (list (car completion-base-affixes) 
base-suffix)))
           (choose-completion nil t t))))))
 
 (defun minibuffer-previous-completion (&optional n)
@@ -4505,9 +4517,17 @@ of `completion-no-auto-exit'.
 If NO-QUIT is non-nil, insert the completion at point to the
 minibuffer, but don't quit the completions window."
   (interactive "P")
-  (with-minibuffer-completions-window
-    (let ((completion-use-base-affixes t))
-      (choose-completion nil no-exit no-quit))))
+  ;; Backported fix for bug#62700
+  (let* ((md (completion--field-metadata (minibuffer--completion-prompt-end)))
+         (base-suffix
+          (if (eq (alist-get 'category (cdr md)) 'file)
+              (buffer-substring (save-excursion (search-forward "/" nil t) 
(point))
+                                (point-max))
+            "")))
+    (with-minibuffer-completions-window
+      (let ((completion-use-base-affixes t)
+            (completion-base-affixes (list (car completion-base-affixes) 
base-suffix)))
+        (choose-completion nil no-exit no-quit)))))
 
 (defun minibuffer-complete-history ()
   "Complete the minibuffer history as far as possible.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]