From 5101a9dc47c9dfbe0326c4f6501139b514261b42 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Sun, 23 Nov 2008 03:02:48 +0000 Subject: [PATCH] (eshell-in-pipeline-p): Add doc-string. (eshell-do-pipelines): Add optional argument to distinguish recursive calls. Use to set eshell-in-pipeline-p to 'first for the first command in a pipeline. --- lisp/eshell/esh-cmd.el | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el index 2e47fd718c2..24b90f53db3 100644 --- a/lisp/eshell/esh-cmd.el +++ b/lisp/eshell/esh-cmd.el @@ -274,7 +274,10 @@ command line.") (defvar eshell-current-command nil) (defvar eshell-command-name nil) (defvar eshell-command-arguments nil) -(defvar eshell-in-pipeline-p nil) +(defvar eshell-in-pipeline-p nil + "Internal Eshell variable, non-nil inside a pipeline. +Has the value 'first, 'last for the first/last commands in the pipeline, +otherwise t.") (defvar eshell-in-subcommand-p nil) (defvar eshell-last-arguments nil) (defvar eshell-last-command-name nil) @@ -816,8 +819,9 @@ this grossness will be made to disappear by using `call/cc'..." (eshell-protect-handles eshell-current-handles) ,object)) -(defmacro eshell-do-pipelines (pipeline) - "Execute the commands in PIPELINE, connecting each to one another." +(defmacro eshell-do-pipelines (pipeline &optional notfirst) + "Execute the commands in PIPELINE, connecting each to one another. +This macro calls itself recursively, with NOTFIRST non-nil." (when (setq pipeline (cadr pipeline)) `(eshell-copy-handles (progn @@ -825,7 +829,7 @@ this grossness will be made to disappear by using `call/cc'..." `(let (nextproc) (progn (set 'nextproc - (eshell-do-pipelines (quote ,(cdr pipeline)))) + (eshell-do-pipelines (quote ,(cdr pipeline)) t)) (eshell-set-output-handle ,eshell-output-handle 'append nextproc) (eshell-set-output-handle ,eshell-error-handle @@ -839,10 +843,13 @@ this grossness will be made to disappear by using `call/cc'..." (setcar head (intern-soft (concat (symbol-name (car head)) "*")))))) - ;; Indicate to the command if it is the last in the pipeline. - ;; Currently only used by eshell-ls-files. - ;; Perhaps nil, rather than 'last, would be OK? - (let ((eshell-in-pipeline-p ,(if (cdr pipeline) t (quote 'last)))) + ;; First and last elements in a pipeline may need special treatment. + ;; (Currently only eshell-ls-files uses 'last.) + ;; Affects process-connection-type in eshell-gather-process-output. + (let ((eshell-in-pipeline-p + ,(cond ((not notfirst) (quote 'first)) + ((cdr pipeline) t) + (t (quote 'last))))) ,(car pipeline)))))) (defmacro eshell-do-pipelines-synchronously (pipeline) -- 2.39.2