;;; esh-ext.el --- commands external to Eshell
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2012 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
;; /bin/grep ; will definitely invoke /bin/grep
;; *grep ; will also invoke /bin/grep
+;;; Code:
+
(provide 'esh-ext)
(eval-when-compile
+ (require 'cl)
(require 'esh-cmd))
(require 'esh-util)
;;; User Variables:
-(defcustom eshell-ext-load-hook '(eshell-ext-initialize)
- "*A hook that gets run when `eshell-ext' is loaded."
+(defcustom eshell-ext-load-hook nil
+ "A hook that gets run when `eshell-ext' is loaded."
+ :version "24.1" ; removed eshell-ext-initialize
:type 'hook
:group 'eshell-ext)
(defcustom eshell-binary-suffixes exec-suffixes
- "*A list of suffixes used when searching for executable files."
+ "A list of suffixes used when searching for executable files."
:type '(repeat string)
:group 'eshell-ext)
(defcustom eshell-force-execution nil
- "*If non-nil, try to execute binary files regardless of permissions.
+ "If non-nil, try to execute binary files regardless of 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
"Search the environment path for NAME."
(if (file-name-absolute-p name)
name
- (let ((list (parse-colon-path (getenv "PATH")))
+ (let ((list (eshell-parse-colon-path eshell-path-env))
suffixes n1 n2 file)
(while list
(setq n1 (concat (car list) name))
(or (eshell-search-path "cmd.exe")
(eshell-search-path "command.com"))
shell-file-name))
- "*The name of the shell command to use for DOS/Windows batch files.
+ "The name of the shell command to use for DOS/Windows batch files.
This defaults to nil on non-Windows systems, where this variable is
wholly ignored."
:type '(choice file (const nil))
(defcustom eshell-interpreter-alist
(if (eshell-under-windows-p)
'(("\\.\\(bat\\|cmd\\)\\'" . eshell-invoke-batch-file)))
- "*An alist defining interpreter substitutions.
+ "An alist defining interpreter substitutions.
Each member is a cons cell of the form:
(MATCH . INTERPRETER)
:group 'eshell-ext)
(defcustom eshell-alternate-command-hook nil
- "*A hook run whenever external command lookup fails.
+ "A hook run whenever external command lookup fails.
If a functions wishes to provide an alternate command, they must throw
it using the tag `eshell-replace-command'. This is done because the
substituted command need not be external at all, and therefore must be
:group 'eshell-ext)
(defcustom eshell-command-interpreter-max-length 256
- "*The maximum length of any command interpreter string, plus args."
+ "The maximum length of any command interpreter string, plus args."
:type 'integer
:group 'eshell-ext)
(defcustom eshell-explicit-command-char ?*
- "*If this char occurs before a command name, call it externally.
+ "If this char occurs before a command name, call it externally.
That is, although `vi' may be an alias, `\vi' will always call the
external version."
:type 'character
(error "%s: external command not found"
(substring command 1))))))
-(defun eshell-remote-command (handler command args)
+(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.
An external command simply means external to Emacs.
(unwind-protect
(progn
(setq exitcode
- (funcall handler 'shell-command
- (mapconcat 'shell-quote-argument
- (append (list command) args) " ")
- outbuf errbuf))
- (eshell-print (save-excursion (set-buffer outbuf)
- (buffer-string)))
- (eshell-error (save-excursion (set-buffer errbuf)
- (buffer-string))))
+ (shell-command
+ (mapconcat 'shell-quote-argument
+ (append (list command) args) " ")
+ outbuf errbuf))
+ (eshell-print (with-current-buffer outbuf (buffer-string)))
+ (eshell-error (with-current-buffer errbuf (buffer-string))))
(eshell-close-handles exitcode 'nil)
(kill-buffer outbuf)
(kill-buffer errbuf))))
(defun eshell-external-command (command args)
"Insert output from an external COMMAND, using ARGS."
(setq args (eshell-stringify-list (eshell-flatten-list args)))
- (let ((handler
- (unless (or (equal default-directory "/")
- (and (eshell-under-windows-p)
- (string-match "\\`[A-Za-z]:[/\\\\]\\'"
- default-directory)))
- (find-file-name-handler default-directory
- 'shell-command))))
- (if (and handler
- (not (and (featurep 'xemacs)
- (eq handler 'dired-handler-fn))))
- (eshell-remote-command handler command args))
- (let ((interp (eshell-find-interpreter command)))
- (assert interp)
- (if (functionp (car interp))
- (apply (car interp) (append (cdr interp) args))
- (eshell-gather-process-output
- (car interp) (append (cdr interp) args))))))
+ (if (file-remote-p default-directory)
+ (eshell-remote-command command args))
+ (let ((interp (eshell-find-interpreter command)))
+ (assert interp)
+ (if (functionp (car interp))
+ (apply (car interp) (append (cdr interp) args))
+ (eshell-gather-process-output
+ (car interp) (append (cdr interp) args)))))
(defun eshell/addpath (&rest args)
"Add a set of paths to PATH."
(let ((finterp
(catch 'found
(ignore
- (eshell-for possible eshell-interpreter-alist
+ (dolist (possible eshell-interpreter-alist)
(cond
((functionp (car possible))
(and (funcall (car possible) file)
(cdr interp)))))
(or interp (list fullname)))))))
-;;; Code:
-
-;; arch-tag: 178d4064-7e60-4745-b81f-bab5d8d7c40f
;;; esh-ext.el ends here