about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/tcpsys.yo18
-rw-r--r--Functions/TCP/tcp_fd_handler1
-rw-r--r--Functions/TCP/tcp_read38
4 files changed, 46 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 77cca38c7..d0d1103c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-01-06  Peter Stephenson  <pws@csr.com>
+
+	* 19339: Doc/Zsh/tcpsys.yo, Functions/TCP/tcp_fd_handler,
+	Functions/TCP/tcp_read: test for whether we are in a zle handler;
+	allow filter to abort output.
+
 2004-01-05  Peter Stephenson  <pws@csr.com>
 
 	* 19336: Src/Zle/compmatch.c: Matches were compared in length
diff --git a/Doc/Zsh/tcpsys.yo b/Doc/Zsh/tcpsys.yo
index c94a15c0b..a8a77e2f9 100644
--- a/Doc/Zsh/tcpsys.yo
+++ b/Doc/Zsh/tcpsys.yo
@@ -506,6 +506,11 @@ zmanref(zshzle)
 ifnzman(\
 noderef(Zle Builtins)
 ).
+
+While active, the function sets the parameter tt(TCP_HANDLER_ACTIVE) to 1.
+This allows shell code called internally (for example, by setting
+tt(tcp_on_read)) to tell if is being called when the shell is otherwise
+idle at the editor prompt.
 )
 findex(tcp_output)
 item(tt(tcp_output [ -q ] -P) var(prompt) tt(-F) var(fd) tt(-S) var(sess))(
@@ -571,6 +576,12 @@ if matched in tt(tcp_output), will cause the line not to be printed to
 standard output.  The patterns should be defined as described for the
 arguments to tt(tcp_expect).  Output of line to log files is not affected.
 )
+vindex(TCP_HANDLER_ACTIVE)
+item(tt(TCP_HANDLER_ACTIVE))(
+Scalar.  Set to 1 within tt(tcp_fd_handler) to indicate to functions
+called recursively that they have been called during an editor session.
+Otherwise unset.
+)
 vindex(TCP_LINE)
 item(tt(TCP_LINE))(
 The last line read by tt(tcp_read), and hence also tt(tcp_expect).
@@ -691,6 +702,13 @@ tt(tcp_read) (which includes lines read by tt(tcp_expect)) is compared
 against the pattern.  If the line matches, the command given in the key is
 called with two arguments: the name of the session from which the line was
 read, and the line itself.
+
+If any function called to handle a line returns a non-zero status, the
+line is not output.  Thus a tt(tcp_on_read) handler containing only
+the instruction `tt(return 1)' can be used to suppress output of
+particular lines (see, however, tt(tcp_filter) above).  However, the line
+is still stored in tt(TCP_LINE) and tt(tcp_lines); this occurs after all
+tt(tcp_on_read) processing.
 )
 enditem()
 
diff --git a/Functions/TCP/tcp_fd_handler b/Functions/TCP/tcp_fd_handler
index 33f553536..8774a2666 100644
--- a/Functions/TCP/tcp_fd_handler
+++ b/Functions/TCP/tcp_fd_handler
@@ -1,4 +1,5 @@
 local line name=${tcp_by_fd[$1]}
+local TCP_HANDLER_ACTIVE=1
 if [[ -n $name ]]
 then
   local TCP_INVALIDATE_ZLE
diff --git a/Functions/TCP/tcp_read b/Functions/TCP/tcp_read
index f70bd798c..cf1b99441 100644
--- a/Functions/TCP/tcp_read
+++ b/Functions/TCP/tcp_read
@@ -60,7 +60,7 @@ setopt extendedglob cbases
 
 zmodload -i zsh/mathfunc
 
-local opt drain line quiet block read_fd all sess key val
+local opt drain line quiet block read_fd all sess key val noprint
 local -A read_fds
 read_fds=()
 float timeout timeout_all endtime
@@ -140,10 +140,10 @@ local helper_stat=2 skip tpat reply REPLY
 float newtimeout
 
 if [[ ${(t)SECONDS} != float* ]]; then
-    # If called from another function, don't override
-    typeset -F TCP_SECONDS_START=$SECONDS
-    # Get extra accuracy by making SECONDS floating point locally
-    typeset -F SECONDS
+  # If called from another function, don't override
+  typeset -F TCP_SECONDS_START=$SECONDS
+  # Get extra accuracy by making SECONDS floating point locally
+  typeset -F SECONDS
 fi
 
 if (( timeout_all )); then
@@ -198,23 +198,27 @@ while (( ${#read_fds} )); do
 
     helper_stat=0
     sess=${tcp_by_fd[$read_fd]}
-    tcp_output -P "${TCP_PROMPT=<-[%s] }" -S $sess -F $read_fd \
-      ${TCP_SILENT:+-q} "$line"
-    # REPLY is now set to the line with an appropriate prompt.
-    tcp_lines+=($REPLY)
-    TCP_LINE=$REPLY TCP_LINE_FD=$read_fd
 
     # Handle user-defined triggers
+    noprint=${TCP_SILENT:+-q}
     if (( ${+tcp_on_read} )); then
-	# Call the function given in the key for each matching value.
-	# It is this way round because function names must be
-	# unique, while patterns do not need to be.  Furthermore,
-	# this keeps the use of subscripting under control.
-	for key val in ${(kv)tcp_on_read}; do
-	    [[ $line = ${~val} ]] && $key "$sess" "$line"
-	done
+      # Call the function given in the key for each matching value.
+      # It is this way round because function names must be
+      # unique, while patterns do not need to be.  Furthermore,
+      # this keeps the use of subscripting under control.
+      for key val in ${(kv)tcp_on_read}; do
+	if [[ $line = ${~val} ]]; then
+	  $key "$sess" "$line" || noprint=-q
+	fi
+      done
     fi
 
+    tcp_output -P "${TCP_PROMPT=<-[%s] }" -S $sess -F $read_fd \
+        $noprint "$line"
+    # REPLY is now set to the line with an appropriate prompt.
+    tcp_lines+=($REPLY)
+    TCP_LINE=$REPLY TCP_LINE_FD=$read_fd
+
     # Only handle one line from one device at a time unless draining.
     [[ -z $drain ]] && return $stat
   done