about summary refs log tree commit diff
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