summaryrefslogtreecommitdiff
path: root/Functions/TCP/tcp_talk
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_talk')
-rw-r--r--Functions/TCP/tcp_talk50
1 files changed, 50 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_talk b/Functions/TCP/tcp_talk
new file mode 100644
index 000000000..9376b9436
--- /dev/null
+++ b/Functions/TCP/tcp_talk
@@ -0,0 +1,50 @@
+# Make line editor input go straight to the current TCP session.
+# Returns when the string $TCP_TALK_ESCAPE (default :) is read on its own.
+# Otherwise, $TCP_TALK_ESCAPE followed by whitespace at the start of a line
+# is stripped off and the rest of the line passed to the shell.
+#
+# History is not currently handled, because this is difficult.
+
+: ${TCP_TALK_ESCAPE:=:}
+
+tcp-accept-line-or-exit() {
+ emulate -L zsh
+ setopt extendedglob
+ local match mbegin mend
+
+ if [[ $BUFFER = ${TCP_TALK_ESCAPE}[[:blank:]]#(#b)(*) ]]; then
+ if [[ -z $match[1] ]]; then
+ BUFFER=
+ zle -A .accept-line accept-line
+ PS1=$TCP_SAVE_PS1
+ unset TCP_SAVE_PS1
+ zle -I
+ print '\r[Normal keyboard input restored]' >&2
+ else
+ BUFFER=$match[1]
+ fi
+ zle .accept-line
+ else
+ # BUGS: is deleted from the command line and doesn't appear in
+ # the history.
+
+ # The following attempt to get the BUFFER into the history falls
+ # foul of the fact that we need to accept the current line first.
+ # But we don't actually want to accept the current line at all.
+ # print -s -r - $BUFFER
+
+ # This is my function to send data over a TCP connection; replace
+ # it with something else or nothing.
+ tcp_send $BUFFER
+ BUFFER=
+ fi
+}
+
+TCP_SAVE_PS1=${PS1##\[T*\]}
+if [[ -o prompt_subst ]]; then
+ PS1="T[\$TCP_SESS]$TCP_SAVE_PS1"
+else
+ PS1="[T]$TCP_SAVE_PS1"
+fi
+zle -N tcp-accept-line-or-exit
+zle -A tcp-accept-line-or-exit accept-line