]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/pcomplete.el: Improve heuristic to rely less on c-t-subvert.
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 20 Mar 2019 16:30:53 +0000 (12:30 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 20 Mar 2019 16:30:53 +0000 (12:30 -0400)
(pcomplete-completions-at-point): Try and take \ escapes into account
when guessing the beginning of the text we're completing.

lisp/pcomplete.el

index d0f2a2e24d11509124989a6571642959f7c491f7..e0800749273c13e4719cd22b406162148c8c8273 100644 (file)
@@ -444,10 +444,28 @@ Same as `pcomplete' but using the standard completion UI."
            ;; table which expects strings using a prefix from the
            ;; buffer's text but internally uses the corresponding
            ;; prefix from pcomplete-stub.
+           ;;
+           (argbeg (pcomplete-begin))
+           ;; When completing an envvar within an argument in Eshell
+           ;; (e.g. "cd /home/$US TAB"), `pcomplete-stub' will just be
+           ;; "US" whereas `argbeg' will point to the first "/".
+           ;; We could rely on c-t-subvert to handle the difference,
+           ;; but we try here to guess the "real" beginning so as to
+           ;; rely less on c-t-subvert.
            (beg (max (- (point) (length pcomplete-stub))
-                     (pcomplete-begin)))
-           (buftext (pcomplete-unquote-argument
-                     (buffer-substring beg (point)))))
+                     argbeg))
+           buftext)
+      ;; Try and improve our guess of `beg' in case the difference
+      ;; between pcomplete-stub and the buffer's text is simply due to
+      ;; some chars removed by unquoting.  Again, this is not
+      ;; indispensable but reduces the reliance on c-t-subvert and
+      ;; improves corner case behaviors.
+      (while (progn (setq buftext (pcomplete-unquote-argument
+                                   (buffer-substring beg (point))))
+                    (and (> beg argbeg)
+                         (> (length pcomplete-stub) (length buftext))))
+        (setq beg (max argbeg (- beg (- (length pcomplete-stub)
+                                        (length buftext))))))
       (when completions
         (let ((table
                (completion-table-with-quoting