`eshell-find-interpreter'.
(eshell-find-interpreter): Add new second parameter ARGS.
* eshell/em-script.el (eshell-script-initialize): Add second arg
to the function added as MATCH to `eshell-interpreter-alist'
* eshell/em-dirs.el (eshell-dirs-initialize): Add second arg to
the function added as MATCH to `eshell-interpreter-alist'
* eshell/em-term.el (eshell-visual-subcommands): New defcustom.
(eshell-visual-options): New defcustom.
(eshell-escape-control-x): Adapt docstring.
(eshell-term-initialize): Test `eshell-visual-subcommands' and
`eshell-visual-options' in addition to `eshell-visual-commands'.
(eshell-exec-visual): Pass args to `eshell-find-interpreter'.
+2013-06-02 Tassilo Horn <tsdh@gnu.org>
+
+ * eshell/esh-ext.el (eshell-external-command): Pass args to
+ `eshell-find-interpreter'.
+ (eshell-find-interpreter): Add new second parameter ARGS.
+
+ * eshell/em-script.el (eshell-script-initialize): Add second arg
+ to the function added as MATCH to `eshell-interpreter-alist'
+
+ * eshell/em-dirs.el (eshell-dirs-initialize): Add second arg to
+ the function added as MATCH to `eshell-interpreter-alist'
+
+ * eshell/em-term.el (eshell-visual-subcommands): New defcustom.
+ (eshell-visual-options): New defcustom.
+ (eshell-escape-control-x): Adapt docstring.
+ (eshell-term-initialize): Test `eshell-visual-subcommands' and
+ `eshell-visual-options' in addition to `eshell-visual-commands'.
+ (eshell-exec-visual): Pass args to `eshell-find-interpreter'.
+
2013-06-01 Fabián Ezequiel Gallina <fgallina@gnu.org>
* progmodes/python.el (python-indent-block-enders): Add break,
(when eshell-cd-on-directory
(make-local-variable 'eshell-interpreter-alist)
(setq eshell-interpreter-alist
- (cons (cons 'eshell-lone-directory-p
+ (cons (cons (lambda (file args)
+ (eshell-lone-directory-p file))
'eshell-dirs-substitute-cd)
eshell-interpreter-alist)))
"Initialize the script parsing code."
(make-local-variable 'eshell-interpreter-alist)
(setq eshell-interpreter-alist
- (cons '((lambda (file)
+ (cons '((lambda (file args)
(string= (file-name-nondirectory file)
"eshell")) . eshell/source)
eshell-interpreter-alist))
:type '(repeat string)
:group 'eshell-term)
+(defcustom eshell-visual-subcommands
+ nil
+ "An alist of the form
+
+ ((COMMAND1 SUBCOMMAND1 SUBCOMMAND2...)
+ (COMMAND2 SUBCOMMAND1 ...))
+
+of commands with subcommands that present their output in a
+visual fashion. A likely entry is
+
+ (\"git\" \"log\" \"diff\" \"show\")
+
+because git shows logs and diffs using a pager by default."
+ :type '(repeat (cons (string :tag "Command")
+ (repeat (string :tag "Subcommand")))))
+
+(defcustom eshell-visual-options
+ nil
+ "An alist of the form
+
+ ((COMMAND1 OPTION1 OPTION2...)
+ (COMMAND2 OPTION1 ...))
+
+of commands with options that present their output in a visual
+fashion. For example, a sensible entry would be
+
+ (\"git\" \"--help\")
+
+because \"git <command> --help\" shows the command's
+documentation with a pager."
+ :type '(repeat (cons (string :tag "Command")
+ (repeat (string :tag "Option")))))
+
;; If you change this from term-term-name, you need to ensure that the
;; value you choose exists in the system's terminfo database. (Bug#12485)
(defcustom eshell-term-name term-term-name
(defcustom eshell-escape-control-x t
"If non-nil, allow <C-x> to be handled by Emacs key in visual buffers.
-See the variable `eshell-visual-commands'. If this variable is set to
-nil, <C-x> will send that control character to the invoked process."
+See the variables `eshell-visual-commands',
+`eshell-visual-subcommands', and `eshell-visual-options'. If
+this variable is set to nil, <C-x> will send that control
+character to the invoked process."
:type 'boolean
:group 'eshell-term)
(make-local-variable 'eshell-interpreter-alist)
(setq eshell-interpreter-alist
(cons (cons (function
- (lambda (command)
- (member (file-name-nondirectory command)
- eshell-visual-commands)))
+ (lambda (command args)
+ (let ((command (file-name-nondirectory command)))
+ (or (member command eshell-visual-commands)
+ (member (car args)
+ (cdr (assoc command eshell-visual-subcommands)))
+ (intersection args
+ (cdr (assoc command eshell-visual-options))
+ :test 'string=)))))
'eshell-exec-visual)
eshell-interpreter-alist)))
ARGS are passed to the program. At the moment, no piping of input is
allowed."
(let* (eshell-interpreter-alist
- (interp (eshell-find-interpreter (car args)))
+ (interp (eshell-find-interpreter (car args) (cdr args)))
(program (car interp))
(args (eshell-flatten-list
(eshell-stringify-list (append (cdr interp)
(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
(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
(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))))
(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)))))))