From 40ee85960ff7915b593063325930e7953f04aff9 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 12 Aug 2024 20:08:38 -0400 Subject: use title from environment --- twopane.bash | 122 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 44 deletions(-) diff --git a/twopane.bash b/twopane.bash index 672448e..3389d51 100755 --- a/twopane.bash +++ b/twopane.bash @@ -14,7 +14,7 @@ then else TOP_CMD=$* fi -TOP_TITLE=$TOP_CMD +TOP_TITLE="Command: $TOP_CMD" TWOPANE=$(mktemp -d) export TWOPANE TOP_CMD BOT_CMD TOP_TITLE BOT_TITLE BOT_SIZE @@ -52,7 +52,6 @@ save_screenrc 'startpane' <<. focus top screen -ln -t "\$TOP_TITLE" 1 $TOP_CMD exec .!. sh -c 'socat UNIX-LISTEN:"\$TWOPANE"/socket STDIN,rawer!!STDOUT' -title 'output' focus top . @@ -65,30 +64,58 @@ restart_top() screen -X source "$TWOPANE"/screenrc.startpane } +socat_connect() +{ + socat STDIN!!STDOUT UNIX-CONNECT:"$TWOPANE"/socket,forever + kill -USR1 $$ + [ "$TOP_EXIT" != restart ] || restart_top +} + connect() { - coproc SOCAT \ - { - socat STDIN!!STDOUT UNIX-CONNECT:"$TWOPANE"/socket,forever - kill -USR1 $$ - [ "$TOP_EXIT" != restart ] || restart_top - } - eval "exec $1<&${SOCAT[0]} $2>&${SOCAT[1]}" + case $# in + 2 ) declare -n std0="$1" std1="$2"; local pid ;; + 3 ) declare -n pid="$1" std0="$2" std1="$3" ;; + * ) exit 1 ;; + esac + std0=${3:-200} + std1=${4:-201} + disconnect $std0 $std1 + coproc SOCAT { socat_connect; } + pid=${SOCAT_PID} + eval "exec ${std0}<&${SOCAT[0]} ${std1}>&${SOCAT[1]}" +} + +sendc() +{ + [ "${SOCAT[0]}" || connect stdin stdout + printf '%s' "$*" >&$stdout +} + +send() +{ + [ "${SOCAT[0]}" || connect stdin stdout + printf '%s\n' "$*" >&$stdout } disconnect() { - eval "exec $1<&- $2>&-" + eval "exec ${1:-200}<&- ${2:-201}>&-" } restart() { - [ "${SOCAT[0]}" ] || restart_top start } start() { + if [ "$STARTED" ] + then + restart_top + else + STARTED=y + fi socat_stty_opts=( rawer echo=0 @@ -106,17 +133,16 @@ start() ) stty=$(printf %s, "${socat_stty_opts[@]}") - trap ': SIGUSR1 ; ' USR1 + trap ': SIGUSR1 ; SOCAT=() ; ' USR1 exec 100<&0 101>&1 while true do - connect 200 201 - socat FD:100,${stty%,}!!STDOUT STDIN!!STDOUT <&200 | - input_filter | - tee >(output_filter | soft_cursor >&101) >&201 + connect stdin stdout + socat FD:100,${stty%,}!!STDOUT STDIN!!STDOUT <&$stdin | + tee >(output_filter | soft_cursor >&101) >&$stdout reset -I -Q -w - disconnect 200 201 + disconnect wait -f "$SOCAT_PID" 2>/dev/null case "$TOP_EXIT" in @@ -143,49 +169,57 @@ focus() screen -X focus "$@" } -input_filter() +output_filter() { - while read -N1 + exec 15> >(exec cat -v) + while read -r -N1 do case "$REPLY" in - a ) echo -n "${REPLY@U}" ;; - A ) echo -n "${REPLY@L}" ;; - * ) echo -n "$REPLY" ;; + $'\n' ) + echo -n '^J' + continue + ;; esac + if [[ "$REPLY" =~ [[:print:]] ]] + then + printf '%s' "$REPLY" + else + printf '%s' "$REPLY" >&15 + fi done } -output_filter() -{ - cat -vt -} - soft_cursor() { - cursor_color=104 - cursor=$'\033['"$cursor_color"$'m \b\033[00m' + cursor=$'\033['${cursor_color:=104}$'m \b\033[00m' printf '%s' "$cursor" - while read -N1 + while read -r -N1 do - printf '%s' "$REPLY" "$cursor" + case "$REPLY" in + $'\r' ) printf '%s' "$REPLY" "$cursor" ;; + * ) printf '%s' $' \b' "$REPLY" "$cursor" ;; + esac done } +our_bashrc_main() +{ + set -f + set -o pipefail + shopt -s lastpipe + trap "screen -X quit" EXIT + export PS1="\$BOT_TITLE\$ " + if [ "\$SHOW_SOCAT_ERRORS" ] + then + exec 20>&2 + else + exec 20>/dev/null + fi +} + save_file bashrc <<. -set -f -set -o pipefail -shopt -s lastpipe -trap "screen -X quit" EXIT $(declare -f) -export PS1="\$BOT_TITLE\$ " - -if [ "\$SHOW_SOCAT_ERRORS" ] -then - exec 20>&2 -else - exec 20>/dev/null -fi - +our_bashrc_main \$BOT_CMD . -- cgit v1.2.3