From: Stefan Monnier Date: Sat, 23 Jun 2012 03:48:18 +0000 (-0400) Subject: * lisp/minibuffer.el (completion--twq-try): Try to fail more gracefully when X-Git-Tag: emacs-24.2.90~1199^2~396 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e33c6771f66d18f0c4c104f50e668cbe82b7e2de;p=emacs.git * lisp/minibuffer.el (completion--twq-try): Try to fail more gracefully when the requote function doesn't work properly. Fixes: debbugs:11714 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2763234e05a..4f7f8a2d300 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2012-06-23 Stefan Monnier + + * minibuffer.el (completion--twq-try): Try to fail more gracefully when + the requote function doesn't work properly (bug#11714). + 2012-06-23 Glenn Morris * pcmpl-rpm.el (pcmpl-rpm-packages): Give status messages. diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index a084ed9fb4d..e5151cd8148 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -488,7 +488,7 @@ for use at QPOS." (defun completion--twq-try (string ustring completion point unquote requote) - ;; Basically two case: either the new result is + ;; Basically two cases: either the new result is ;; - commonprefix1 morecommonprefix suffix ;; - commonprefix newprefix suffix (pcase-let* @@ -505,8 +505,13 @@ for use at QPOS." ((> point (length prefix)) (+ qpos (length qstr1))) (t (car (funcall requote point string)))))) ;; Make sure `requote' worked. - (assert (equal (funcall unquote qstring) completion)) - (cons qstring qpoint))) + (if (equal (funcall unquote qstring) completion) + (cons qstring qpoint) + ;; If requote failed (e.g. because sifn-requote did not handle + ;; Tramp's "/foo:/bar//baz -> /foo:/baz" truncation), then at least + ;; try requote properly. + (let ((qstr (funcall qfun completion))) + (cons qstr (length qstr)))))) (defun completion--string-equal-p (s1 s2) (eq t (compare-strings s1 nil nil s2 nil nil 'ignore-case))) @@ -2130,6 +2135,12 @@ same as `substitute-in-file-name'." ;; find the position corresponding to UPOS in QSTR, but ;; substitute-in-file-name can do anything, depending on file-name-handlers. ;; Kind of like in rfn-eshadow-update-overlay, only worse. + ;; FIXME: example of thing we do not handle: Tramp's makes + ;; (substitute-in-file-name "/foo:~/bar//baz") -> "/scpc:foo:/baz". + ;; FIXME: One way to try and handle "all" cases is to require + ;; substitute-in-file-name to preserve text-properties, so we could + ;; apply text-properties to the input string and then look for them in + ;; the output to understand what comes from where. (let ((qpos 0)) ;; Handle substitute-in-file-name's truncation behavior. (let (tpos) @@ -2824,14 +2835,14 @@ filter out additional entries (because TABLE might not obey PRED)." (defun completion--sreverse (str) "Like `reverse' but for a string STR rather than a list." - (apply 'string (nreverse (mapcar 'identity str)))) + (apply #'string (nreverse (mapcar 'identity str)))) (defun completion--common-suffix (strs) "Return the common suffix of the strings STRS." (completion--sreverse (try-completion "" - (mapcar 'completion--sreverse strs)))) + (mapcar #'completion--sreverse strs)))) (defun completion-pcm--merge-completions (strs pattern) "Extract the commonality in STRS, with the help of PATTERN.