From a892f5e24c60a5a77fc375aedca501152da0686c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 6 Jan 2004 13:56:12 +0000 Subject: 19339: minor TCP function suite additions --- ChangeLog | 6 ++++++ Doc/Zsh/tcpsys.yo | 18 ++++++++++++++++++ Functions/TCP/tcp_fd_handler | 1 + Functions/TCP/tcp_read | 38 +++++++++++++++++++++----------------- 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 + + * 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 * 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 -- cgit 1.4.1