]> code.delx.au - gnu-emacs/blobdiff - lisp/eshell/esh-ext.el
Update copyright year to 2015
[gnu-emacs] / lisp / eshell / esh-ext.el
index e48213c54d6c74da7bc0d97b99fae61cac52f794..0b25b31eff9da863be324f9fd63deb1bc37207cf 100644 (file)
@@ -1,6 +1,6 @@
-;;; esh-ext.el --- commands external to Eshell
+;;; esh-ext.el --- commands external to Eshell  -*- lexical-binding:t -*-
 
-;; Copyright (C) 1999-201 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
@@ -90,6 +92,10 @@ since nothing else but Eshell will be able to understand
        (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\\)"
@@ -103,6 +109,8 @@ wholly ignored."
   :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
@@ -121,9 +129,10 @@ Each member is a cons cell of the form:
 
   (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
@@ -179,6 +188,8 @@ This bypasses all Lisp functions and aliases."
        (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.
@@ -209,6 +220,7 @@ causing the user to wonder if anything's really going on..."
   (setq args (eshell-stringify-list (eshell-flatten-list args)))
   (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
@@ -261,7 +273,7 @@ Return nil, or a list of the form:
                (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>."
@@ -271,8 +283,9 @@ 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))))
@@ -283,6 +296,11 @@ line of the form #!<interp>."
       (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
@@ -306,7 +324,7 @@ line of the form #!<interp>."
            (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)))))))