changeset 99824:df01f003c105

(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.
author Glenn Morris <rgm@gnu.org>
date Sun, 23 Nov 2008 03:02:48 +0000
parents 37c5485deb0e
children b49dc2c06161
files lisp/eshell/esh-cmd.el
diffstat 1 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/eshell/esh-cmd.el	Sun Nov 23 02:53:35 2008 +0000
+++ b/lisp/eshell/esh-cmd.el	Sun Nov 23 03:02:48 2008 +0000
@@ -274,7 +274,10 @@
 (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 @@
      (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 @@
 	   `(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 @@
 	      (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)