]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix eshell directory and executable completion on action t
authorDaniel Pettersson <daniel@dpettersson.net>
Mon, 19 Sep 2022 08:21:59 +0000 (10:21 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 19 Sep 2022 08:22:55 +0000 (10:22 +0200)
* lisp/eshell/em-cmpl.el (eshell--pcomplete-executables): New
function (bug#57905).
(eshell--complete-commands-list): Use it.

Copyright-paperwork-exempt: yes

lisp/eshell/em-cmpl.el

index 822cc941491b761cb07d259a69e4e0afcd450b8c..ac82e3f225ca2cf5c12233c4611bc28291c6bf17 100644 (file)
@@ -378,6 +378,31 @@ to writing a completion function."
           args)
          posns)))
 
+(defun eshell--pcomplete-executables ()
+  "Complete amongst a list of directories and executables.
+
+Wrapper for `pcomplete-executables' or `pcomplete-dirs-or-entries',
+depending on the value of `eshell-force-execution'.
+
+Adds path prefix to candidates independent of `action' value."
+  ;; `pcomplete-entries' returns filenames without path on `action' to
+  ;; use current string directory as done in `completion-file-name-table'
+  ;; when `action' is nil to construct executable candidates.
+  (let ((table (if eshell-force-execution
+                   (pcomplete-dirs-or-entries nil #'file-readable-p)
+                 (pcomplete-executables))))
+    (lambda (string pred action)
+      (let ((cands (funcall table string pred action)))
+        (if (eq action t)
+            (let ((specdir (file-name-directory string)))
+              (mapcar
+               (lambda (cand)
+                 (if (stringp cand)
+                     (file-name-concat specdir cand)
+                   cand))
+               cands))
+          cands)))))
+
 (defun eshell--complete-commands-list ()
   "Generate list of applicable, visible commands."
   ;; Building the commands list can take quite a while, especially over Tramp
@@ -392,9 +417,7 @@ to writing a completion function."
     (completion-table-dynamic
      (lambda (filename)
        (if (file-name-directory filename)
-           (if eshell-force-execution
-               (pcomplete-dirs-or-entries nil #'file-readable-p)
-             (pcomplete-executables))
+           (eshell--pcomplete-executables)
         (let* ((paths (eshell-get-path))
                (cwd (file-name-as-directory
                      (expand-file-name default-directory)))