From 357c6780699b4df2049f06b96257ebff8bfb4d6e Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 25 Jul 2024 08:39:38 -0400 Subject: [PATCH] lisp/minibuffer.el (completion--sifn-requote): Fix bug#72176 (cherry picked from commit 7170282a59a1981cd44f46d69a28f2c47a46884b) --- lisp/minibuffer.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index f6b0ca5bd10..8d3d41d33f7 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -3824,7 +3824,7 @@ strings in `completion-ignored-extensions'." (file-error nil))) ;PCM often calls with invalid directories. (defun completion--sifn-requote (upos qstr) - ;; We're looking for `qpos' such that: + ;; We're looking for (the largest) `qpos' such that: ;; (equal (substring (substitute-in-file-name qstr) 0 upos) ;; (substitute-in-file-name (substring qstr 0 qpos))) ;; Big problem here: we have to reverse engineer substitute-in-file-name to @@ -3854,11 +3854,13 @@ strings in `completion-ignored-extensions'." ;; Main assumption: nothing after qpos should affect the text before upos, ;; so we can work our way backward from the end of qstr, one character ;; at a time. - ;; Second assumptions: If qpos is far from the end this can be a bit slow, + ;; Second assumption: If qpos is far from the end this can be a bit slow, ;; so we speed it up by doing a first loop that skips a word at a time. ;; This word-sized loop is careful not to cut in the middle of env-vars. (while (let ((boundary (string-match "\\(\\$+{?\\)?\\w+\\W*\\'" qstr))) (and boundary + ;; Try and make sure we keep the largest `qpos' (bug#72176). + (not (string-match-p "/[/~]" qstr boundary)) (progn (setq qprefix (substring qstr 0 boundary)) (string-prefix-p uprefix -- 2.39.5