From d105b0e26f965b41452153ad405efe98ff142de6 Mon Sep 17 00:00:00 2001 From: Tassilo Horn Date: Sun, 2 Jun 2013 11:19:09 +0200 Subject: [PATCH] * 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'. --- lisp/ChangeLog | 19 +++++++++++++++ lisp/eshell/em-dirs.el | 3 ++- lisp/eshell/em-script.el | 2 +- lisp/eshell/em-term.el | 52 +++++++++++++++++++++++++++++++++++----- lisp/eshell/esh-ext.el | 17 +++++++------ 5 files changed, 78 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4a2fb7cc1c..f05378a2cd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,22 @@ +2013-06-02 Tassilo Horn + + * 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 * progmodes/python.el (python-indent-block-enders): Add break, diff --git a/lisp/eshell/em-dirs.el b/lisp/eshell/em-dirs.el index c93bbe9ecb..106ca152c9 100644 --- a/lisp/eshell/em-dirs.el +++ b/lisp/eshell/em-dirs.el @@ -207,7 +207,8 @@ Thus, this does not include the current directory.") (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))) diff --git a/lisp/eshell/em-script.el b/lisp/eshell/em-script.el index 711b2e2146..13ae6941dd 100644 --- a/lisp/eshell/em-script.el +++ b/lisp/eshell/em-script.el @@ -61,7 +61,7 @@ This includes when running `eshell-command'." "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)) diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el index e5360f2deb..7875fbc9c8 100644 --- a/lisp/eshell/em-term.el +++ b/lisp/eshell/em-term.el @@ -65,6 +65,39 @@ which commands are considered visual in nature." :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 --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 @@ -77,8 +110,10 @@ used." (defcustom eshell-escape-control-x t "If non-nil, allow to be handled by Emacs key in visual buffers. -See the variable `eshell-visual-commands'. If this variable is set to -nil, 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, will send that control +character to the invoked process." :type 'boolean :group 'eshell-term) @@ -93,9 +128,14 @@ nil, will send that control character to the invoked process." (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))) @@ -104,7 +144,7 @@ nil, will send that control character to the invoked process." 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) diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el index c4e4c000bd..474e536de2 100644 --- a/lisp/eshell/esh-ext.el +++ b/lisp/eshell/esh-ext.el @@ -125,9 +125,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 @@ -215,6 +216,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 @@ -267,7 +269,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 #!." @@ -277,8 +279,9 @@ line of the form #!." (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)))) @@ -312,7 +315,7 @@ line of the form #!." (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))))))) -- 2.20.1