From: Eli Zaretskii Date: Wed, 29 Apr 2015 17:52:02 +0000 (+0300) Subject: PATH- and completion-related fixes in Eshell on MS-Windows X-Git-Tag: emacs-25.0.90~2253 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3c3eb1d5f2f56bc8e49ae40881a543fbddf8f312;p=emacs.git PATH- and completion-related fixes in Eshell on MS-Windows * lisp/eshell/esh-ext.el (eshell-search-path): When running on MS-Windows, prepend "." to list of directories produced from PATH, as Windows always implicitly searches the current directory first. (eshell-force-execution): Make it have a non-nil default value on MS-Windows and MS-DOS. * lisp/eshell/em-cmpl.el (eshell-complete-commands-list): If eshell-force-execution is non-nil, complete on readable files and directories, not only executables. When running on MS-Windows, prepend "." to list of directories produced from PATH, as Windows always implicitly searches the current directory first. --- diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el index dbea9e5ceec..93b275e2ffb 100644 --- a/lisp/eshell/em-cmpl.el +++ b/lisp/eshell/em-cmpl.el @@ -405,7 +405,9 @@ to writing a completion function." "Generate list of applicable, visible commands." (let ((filename (pcomplete-arg)) glob-name) (if (file-name-directory filename) - (pcomplete-executables) + (if eshell-force-execution + (pcomplete-dirs-or-entries nil 'file-readable-p) + (pcomplete-executables)) (if (and (> (length filename) 0) (eq (aref filename 0) eshell-explicit-command-char)) (setq filename (substring filename 1) @@ -416,6 +418,8 @@ to writing a completion function." (expand-file-name default-directory))) (path "") (comps-in-path ()) (file "") (filepath "") (completions ())) + (if (eshell-under-windows-p) + (push "." paths)) ;; Go thru each path in the search path, finding completions. (while paths (setq path (file-name-as-directory @@ -431,7 +435,9 @@ to writing a completion function." (if (and (not (member file completions)) ; (or (string-equal path cwd) (not (file-directory-p filepath))) - (file-executable-p filepath)) + (if eshell-force-execution + (file-readable-p filepath) + (file-executable-p filepath))) (setq completions (cons file completions))) (setq comps-in-path (cdr comps-in-path))) (setq paths (cdr paths))) diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el index 0b25b31eff9..91c4f4b6095 100644 --- a/lisp/eshell/esh-ext.el +++ b/lisp/eshell/esh-ext.el @@ -60,14 +60,15 @@ loaded into memory, thus beginning a new process." :type '(repeat string) :group 'eshell-ext) -(defcustom eshell-force-execution nil - "If non-nil, try to execute binary files regardless of permissions. +(defcustom eshell-force-execution + (not (null (memq system-type '(windows-nt ms-dos)))) + "If non-nil, try to execute files regardless of execute permissions. This can be useful on systems like Windows, where the operating system -doesn't happen to honor the permission bits in certain cases; or in -cases where you want to associate an interpreter with a particular -kind of script file, but the language won't let you but a '#!' -interpreter line in the file, and you don't want to make it executable -since nothing else but Eshell will be able to understand +doesn't support the execution bit for shell scripts; or in cases where +you want to associate an interpreter with a particular kind of script +file, but the language won't let you but a '#!' interpreter line in +the file, and you don't want to make it executable since nothing else +but Eshell will be able to understand `eshell-interpreter-alist'." :type 'boolean :group 'eshell-ext) @@ -78,6 +79,8 @@ since nothing else but Eshell will be able to understand name (let ((list (eshell-parse-colon-path eshell-path-env)) suffixes n1 n2 file) + (if (eshell-under-windows-p) + (push "." list)) (while list (setq n1 (concat (car list) name)) (setq suffixes eshell-binary-suffixes)