summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-01-06 13:56:12 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-01-06 13:56:12 +0000
commita892f5e24c60a5a77fc375aedca501152da0686c (patch)
tree03da6ba80dedcde37ad928d9cf10b52da6c80288
parent66329cbe4c9842e6515d8a1b07b83b2ef3bcae35 (diff)
downloadzsh-a892f5e24c60a5a77fc375aedca501152da0686c.tar.gz
zsh-a892f5e24c60a5a77fc375aedca501152da0686c.zip
19339: minor TCP function suite additions
-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