- try to guess whether sleep(1) supports fractions - remove GNUisms from sed(1) lines without breaking GNU sed usage - try termcap(5) capabilities first - correct example line in usage - prevent word splitting when reading command list - remove command list on SIGINT and SIGTERM, too - don't use backquotes, they have side effect of removing one layer of quoting - prevent glob expansion when stripping output --- contrib/stumpish | 93 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 63 insertions(+), 30 deletions(-) diff --git contrib/stumpish~ contrib/stumpish index 1d48bb4..2b0fca1 100755 --- contrib/stumpish~ +++ contrib/stumpish @@ -21,19 +21,25 @@ ### STUMPwm Interactive SHell. -if sleep --version 2>/dev/null | grep -q GNU +DELAY=0.01 + +if ! sleep $DELAY 2>/dev/null >&2 then - DELAY=0.1 -else DELAY=1 fi +# parse C-style backslash sequences by default +if [ "$(echo -e foo)" = foo ]; then + echo() { builtin echo -e "$@"; } +fi + wait_result () { while true do - RESULT=`xprop -root -f STUMPWM_COMMAND_RESULT 8s STUMPWM_COMMAND_RESULT 2>/dev/null` - + RESULT=$(xprop -root -f STUMPWM_COMMAND_RESULT 8s \ + STUMPWM_COMMAND_RESULT 2>/dev/null | + sed -E 's/\\([[:digit:]]+)/\\0\1/g') if echo "$RESULT" | grep -v -q 'not found.$' then break @@ -49,8 +55,14 @@ wait_result () return 1 fi - echo $RESULT | sed 's/[^"]*"//;s/"$//;s/\\n/\n/g;s/\\"/"/g;s/\n\+$//; - s/\^[*[:digit:]]\{2\}//g;s/\^[Bbn]//g;' + echo "$RESULT" | + sed -E 's/[^"\\n]+"// + s/"[[:space:]]*$// + s/([^\\])\\n/\1\ +/g + s/\\(["\\n])/\1/g + s/\^([*[:digit:]]+|[Bbn])//g' | + sed '/^[[:space:]]*$/d' } send_cmd () @@ -73,7 +85,7 @@ send_cmd () usage () { cat <&2 +} + +tput () +{ + local cap1=$1 cap2=$2 + shift 2 + + command tput $cap1 $@ || + command tput $cap2 $@ +} + READLINE=yes if [ "x$1" = "x-r" ] @@ -112,7 +144,7 @@ then fi shift 1 IFS='' - ARGS=`cat /dev/stdin` + ARGS=$(cat /dev/stdin) send_cmd "$1 $ARGS" else IFS=' ' @@ -121,37 +153,38 @@ then else if [ -t 0 ] then - if [ $READLINE = yes ] && type rlwrap >/dev/null 2>&1 + if ! type rlwrap 2>/dev/null >&2 + then + warn rlwrap not found, command completion won\'t work + elif [ $READLINE = yes ] then # Note: $TEMP is not conventional; it is left here purely # for backwards compatibility. - COMMANDS="${TEMP:-${TEMPDIR:-/var/tmp}}/stumpish.commands.$$" - echo `send_cmd "commands"` | sed 's/[[:space:]]\+/\n/g' | sort > "$COMMANDS" - rlwrap -f "$COMMANDS" "$0" -r - rm -f "$COMMANDS" + COMMANDS="${TMPDIR:-/tmp}/stumpish.commands.$$" + echo $(send_cmd "commands") | + sed -E 's/[[:space:]]+/\ +/g' | + sort > "$COMMANDS" + trap 'rm -f "$COMMANDS"' exit int term + rlwrap -b '' -f "$COMMANDS" "$0" -r exit fi - tput setaf 5 + tput AF setaf 5 echo Welcome to the STUMPwm Interactive SHell. - tput sgr0 - echo -n 'Type ' - tput setaf 2 - echo -n commands - tput sgr0 + tput me sgr0 + echo 'Type \c' + tput AF setaf 2 + echo 'commands\c' + tput me sgr0 echo \ for a list of commands. - IFS=' -' - echo -n "> " - while read REPLY + while read -p '> ' REPLY do - tput bold - tput setaf 2 + tput md bold + tput AF setaf 2 send_cmd "$REPLY" - tput sgr0 - - echo -n "> " + tput me sgr0 done else while read REPLY -- 1.7.1.1