-;;; esh-ext.el --- commands external to Eshell
+;;; esh-ext.el --- commands external to Eshell -*- lexical-binding:t -*-
-;; Copyright (C) 1999-2012 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2015 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
(provide 'esh-ext)
+(require 'esh-util)
+
(eval-when-compile
(require 'cl-lib)
+ (require 'esh-io)
(require 'esh-cmd))
-(require 'esh-util)
(require 'esh-opt)
(defgroup eshell-ext nil
(setq list (cdr list)))
file)))
+;; This file provides itself then eval-when-compile loads files that require it.
+;; This causes spurious "might not be defined at runtime" warnings.
+(declare-function eshell-search-path "esh-ext" (name))
+
(defcustom eshell-windows-shell-file
(if (eshell-under-windows-p)
(if (string-match "\\(cmdproxy\\|sh\\)\\.\\(com\\|exe\\)"
:type '(choice file (const nil))
:group 'eshell-ext)
+(autoload 'eshell-parse-command "esh-cmd")
+
(defsubst eshell-invoke-batch-file (&rest args)
"Invoke a .BAT or .CMD file on DOS/Windows systems."
;; since CMD.EXE can't handle forward slashes in the initial
(MATCH . INTERPRETER)
-MATCH should be a regexp, which is matched against the command name,
-or a function. If either returns a non-nil value, then INTERPRETER
-will be used for that command.
+MATCH should be a regexp, which is matched against the command
+name, or a function of arity 2 receiving the COMMAND and its
+ARGS (a list). If either returns a non-nil value, then
+INTERPRETER will be used for that command.
If INTERPRETER is a string, it will be called as the command name,
with the original command name passed as the first argument, with all
(error "%s: external command not found"
(substring command 1))))))
+(autoload 'eshell-close-handles "esh-io")
+
(defun eshell-remote-command (command args)
"Insert output from a remote COMMAND, using ARGS.
A remote command is something that executes on a different machine.
(defun eshell-external-command (command args)
"Insert output from an external COMMAND, using ARGS."
(setq args (eshell-stringify-list (eshell-flatten-list args)))
- ;; (if (file-remote-p default-directory)
- ;; (eshell-remote-command command args))
- (let ((interp (eshell-find-interpreter command)))
+ (let ((interp (eshell-find-interpreter
+ command
+ args
+ ;; `eshell-find-interpreter' does not work correctly
+ ;; for Tramp file name syntax. But we don't need to
+ ;; know the interpreter in that case, therefore the
+ ;; check is suppressed.
+ (or (and (stringp command) (file-remote-p command))
+ (file-remote-p default-directory)))))
(cl-assert interp)
(if (functionp (car interp))
(apply (car interp) (append (cdr interp) args))
Adds the given PATH to $PATH.")
(if args
(progn
- (setq eshell-path-env (getenv "PATH"))
- (dolist (dir (if prepend (nreverse args) args))
- (setq eshell-path-env
- (if prepend
- (concat dir path-separator eshell-path-env)
- (concat eshell-path-env path-separator dir))))
+ (setq eshell-path-env (getenv "PATH")
+ args (mapconcat 'identity args path-separator)
+ eshell-path-env
+ (if prepend
+ (concat args path-separator eshell-path-env)
+ (concat eshell-path-env path-separator args)))
(setenv "PATH" eshell-path-env))
(dolist (dir (parse-colon-path (getenv "PATH")))
(eshell-printn dir)))))
(list (match-string 1)
file)))))))
-(defun eshell-find-interpreter (file &optional no-examine-p)
+(defun eshell-find-interpreter (file args &optional no-examine-p)
"Find the command interpreter with which to execute FILE.
If NO-EXAMINE-P is non-nil, FILE will not be inspected for a script
line of the form #!<interp>."
(dolist (possible eshell-interpreter-alist)
(cond
((functionp (car possible))
- (and (funcall (car possible) file)
- (throw 'found (cdr possible))))
+ (let ((fn (car possible)))
+ (and (funcall fn file args)
+ (throw 'found (cdr possible)))))
((stringp (car possible))
(and (string-match (car possible) file)
(throw 'found (cdr possible))))
(let ((fullname (if (file-name-directory file) file
(eshell-search-path file)))
(suffixes eshell-binary-suffixes))
+ (if (and fullname
+ (not (file-remote-p fullname))
+ (file-remote-p default-directory))
+ (setq fullname (expand-file-name
+ (concat "./" fullname) default-directory)))
(if (and fullname (not (or eshell-force-execution
(file-executable-p fullname))))
(while suffixes
(setq interp (eshell-script-interpreter fullname))
(if interp
(setq interp
- (cons (car (eshell-find-interpreter (car interp) t))
+ (cons (car (eshell-find-interpreter (car interp) args t))
(cdr interp)))))
(or interp (list fullname)))))))