From 00b4f74bfb56503e22f9ecfb42cf6605dc63f63c Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Tue, 4 Aug 2020 15:54:39 +0300 Subject: [PATCH 1/4] track escape sequences --- shfm | 77 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/shfm b/shfm index bc76759..f592ebf 100755 --- a/shfm +++ b/shfm @@ -1,15 +1,37 @@ #!/bin/sh +esc() { + case $1 in + cursorhome) printf '%s[%s;%sH' "$esc_char" "$2" "$3" ;; # VT100 + ED[0-2]) printf '%s[%sJ' "$esc_char" "${1#ED}" ;; # VT100 + EL[0-2]) printf '%s[%sK' "$esc_char" "${1#EL}" ;; # VT100 + DECSTBM) printf '%s[%s;%sr' "$esc_char" "$2" "$3" ;; # VT100 + DECAWM) printf '%s[?7%s' "$esc_char" "$2" ;; # VT100 + DECTCEM) printf '%s[?25%s' "$esc_char" "$2" ;; # VT500? + screen_alt) printf '%s[?1049%s' "$esc_char" "$2" ;; # xterm + CUU) printf '%s[%sA' "$esc_char" "$2" ;; # VT100 + CUD) printf '%s[%sB' "$esc_char" "$2" ;; # VT100 + IL) printf '%s[%sL' "$esc_char" "$2" ;; # VT102? + SGR) printf '%s[%s;%sm' "$esc_char" "$2" "$3" ;; # VT100 + DECSC) printf '%s%s' "$esc_char" "$2" ;; # VT100 + esac +} + term_setup() { stty=$(stty -g) stty -icanon -echo - printf '\033[?7l\033[?25l\033[2J\033[1;%sr' \ - "$((LINES - 2))" + esc DECAWM l + esc DECTCEM l + esc ED2 + esc DECSTBM 1 "$((LINES - 2))" } term_reset() { - printf '\033[?7h\033[?25h\033[2J\033[;r' + esc DECAWM h + esc DECTCEM h + esc ED2 + esc DECSTBM stty "$stty" } @@ -29,9 +51,11 @@ term_resize() { } cmd_run() { - printf '\033[?1049h\033[?25h' + esc screen_alt h + esc DECTCEM h "$@" - printf '\033[?25l\033[?1049l' + esc screen_alt l + esc DECTCEM l } file_escape() { @@ -68,7 +92,8 @@ hist_search() { } list_print() { - printf '\033[2J\033[H' + esc ED2 + esc cursorhome i=1 end=$((bottom + 1)) @@ -89,17 +114,22 @@ list_print() { file_escape "$file" case $i in - "$y2") printf '\033[34;7m' + "$y2") esc SGR 34 7 esac case $((i - end)) in - -*) printf '%s\033[m\033[B\r' "$safe" + -*) + printf %s "$safe" + esc SGR + esc CUD + printf '\r' + ;; esac i=$((i + 1)) done - printf '\033[%sH' "$((y > bottom ? y2 : y))" + esc cursorhome "$((y > bottom ? y2 : y))" } redraw() { @@ -108,12 +138,20 @@ redraw() { } status_line() { - printf '\0337\033[%sH\033[31;7m%-*s\033[m\0338' \ - "$LINES" "$COLUMNS" "$1" + esc DECSC 7 + esc cursorhome "$LINES" + esc SGR 31 7 + printf '%-*s' "$COLUMNS" "$1" + esc SGR + esc DECSC 8 } prompt() { - printf '\0337\033[%sH%s\033[?25h\033[K' "$LINES" "$1" + esc DECSC 7 + esc cursorhome "$LINES" + printf %s "$1" + esc DECTCEM h + esc EL0 case $2 in r) @@ -123,7 +161,8 @@ prompt() { ;; esac - printf '\0338\033[?25l' + esc DECSC 8 + esc DECTCEM l status_line "($y/$#) $PWD" } @@ -131,12 +170,16 @@ print_line() { offset=$1 case $offset in - "$y") printf '\033[34;7m' + "$y") esc SGR 34 7 esac shift "$offset" file_escape "$1" - printf '\033[K%s\033[m\r' "$safe" + + esc EL0 + printf %s "$safe" + esc SGR + printf '\r' case $offset in "$y") cur=$1 @@ -182,11 +225,11 @@ main() { case $y2 in 1) - printf '\033[L' + esc IL ;; *) - printf '\033[A' + esc CUU y2=$((y2 > 1 ? y2 - 1 : 1)) ;; esac From 7bdd99e742d72b288743dfa43ba8f07f3fe36c8e Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Tue, 4 Aug 2020 16:04:09 +0300 Subject: [PATCH 2/4] correct save/restore cursor' --- shfm | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/shfm b/shfm index f592ebf..43a808f 100755 --- a/shfm +++ b/shfm @@ -2,18 +2,19 @@ esc() { case $1 in - cursorhome) printf '%s[%s;%sH' "$esc_char" "$2" "$3" ;; # VT100 + CUD) printf '%s[%sB' "$esc_char" "$2" ;; # VT100 + CUU) printf '%s[%sA' "$esc_char" "$2" ;; # VT100 + DECAWM) printf '%s[?7%s' "$esc_char" "$2" ;; # VT100 + DECSC) printf '%s7' "$esc_char" ;; # VT100 + DECRC) printf '%s8' "$esc_char" ;; # VT100 + DECSTBM) printf '%s[%s;%sr' "$esc_char" "$2" "$3" ;; # VT100 + DECTCEM) printf '%s[?25%s' "$esc_char" "$2" ;; # VT50X? ED[0-2]) printf '%s[%sJ' "$esc_char" "${1#ED}" ;; # VT100 EL[0-2]) printf '%s[%sK' "$esc_char" "${1#EL}" ;; # VT100 - DECSTBM) printf '%s[%s;%sr' "$esc_char" "$2" "$3" ;; # VT100 - DECAWM) printf '%s[?7%s' "$esc_char" "$2" ;; # VT100 - DECTCEM) printf '%s[?25%s' "$esc_char" "$2" ;; # VT500? - screen_alt) printf '%s[?1049%s' "$esc_char" "$2" ;; # xterm - CUU) printf '%s[%sA' "$esc_char" "$2" ;; # VT100 - CUD) printf '%s[%sB' "$esc_char" "$2" ;; # VT100 - IL) printf '%s[%sL' "$esc_char" "$2" ;; # VT102? + IL) printf '%s[%sL' "$esc_char" "$2" ;; # VT10X? SGR) printf '%s[%s;%sm' "$esc_char" "$2" "$3" ;; # VT100 - DECSC) printf '%s%s' "$esc_char" "$2" ;; # VT100 + cursorhome) printf '%s[%s;%sH' "$esc_char" "$2" "$3" ;; # VT100 + screen_alt) printf '%s[?1049%s' "$esc_char" "$2" ;; # xterm esac } @@ -138,16 +139,16 @@ redraw() { } status_line() { - esc DECSC 7 + esc DECSC esc cursorhome "$LINES" esc SGR 31 7 printf '%-*s' "$COLUMNS" "$1" esc SGR - esc DECSC 8 + esc DECRC } prompt() { - esc DECSC 7 + esc DECSC esc cursorhome "$LINES" printf %s "$1" esc DECTCEM h @@ -161,7 +162,7 @@ prompt() { ;; esac - esc DECSC 8 + esc DECRC esc DECTCEM l status_line "($y/$#) $PWD" } From f8634de3e3346d4853edfe9182599d60601807c8 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Tue, 4 Aug 2020 16:06:04 +0300 Subject: [PATCH 3/4] less comments --- shfm | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/shfm b/shfm index 43a808f..d861d70 100755 --- a/shfm +++ b/shfm @@ -2,19 +2,22 @@ esc() { case $1 in - CUD) printf '%s[%sB' "$esc_char" "$2" ;; # VT100 - CUU) printf '%s[%sA' "$esc_char" "$2" ;; # VT100 - DECAWM) printf '%s[?7%s' "$esc_char" "$2" ;; # VT100 - DECSC) printf '%s7' "$esc_char" ;; # VT100 - DECRC) printf '%s8' "$esc_char" ;; # VT100 - DECSTBM) printf '%s[%s;%sr' "$esc_char" "$2" "$3" ;; # VT100 - DECTCEM) printf '%s[?25%s' "$esc_char" "$2" ;; # VT50X? - ED[0-2]) printf '%s[%sJ' "$esc_char" "${1#ED}" ;; # VT100 - EL[0-2]) printf '%s[%sK' "$esc_char" "${1#EL}" ;; # VT100 - IL) printf '%s[%sL' "$esc_char" "$2" ;; # VT10X? - SGR) printf '%s[%s;%sm' "$esc_char" "$2" "$3" ;; # VT100 - cursorhome) printf '%s[%s;%sH' "$esc_char" "$2" "$3" ;; # VT100 + # vt100 + CUD) printf '%s[%sB' "$esc_char" "$2" ;; + CUU) printf '%s[%sA' "$esc_char" "$2" ;; + DECAWM) printf '%s[?7%s' "$esc_char" "$2" ;; + DECSC) printf '%s7' "$esc_char" ;; + DECRC) printf '%s8' "$esc_char" ;; + DECSTBM) printf '%s[%s;%sr' "$esc_char" "$2" "$3" ;; + ED[0-2]) printf '%s[%sJ' "$esc_char" "${1#ED}" ;; + EL[0-2]) printf '%s[%sK' "$esc_char" "${1#EL}" ;; + SGR) printf '%s[%s;%sm' "$esc_char" "$2" "$3" ;; + cursorhome) printf '%s[%s;%sH' "$esc_char" "$2" "$3" ;; + + # private + IL) printf '%s[%sL' "$esc_char" "$2" ;; # VT102(?) screen_alt) printf '%s[?1049%s' "$esc_char" "$2" ;; # xterm + DECTCEM) printf '%s[?25%s' "$esc_char" "$2" ;; # VT520(?) esac } From 15beaf3f5f088d916b437516f85da4e53c03d155 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Tue, 4 Aug 2020 16:12:11 +0300 Subject: [PATCH 4/4] docs: update --- README | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README b/README index 3f7d9cf..aad7270 100644 --- a/README +++ b/README @@ -17,11 +17,16 @@ ________________________________________________________________________________ * works with very small terminal sizes. *** SIGWINCH and the size parameter to stty are not /yet/ POSIX but will be. + - https://austingroupbugs.net/view.php?id=1053 - https://austingroupbugs.net/view.php?id=1151 -*** Raw escape sequences are used in place of tput. These are strictly VT100 - sequences minus \033[?1049[lh], \033[?25[lh] and \033[?7[lh] (?) +*** Raw VT100 escape sequences are used in place of tput. A few non-VT100 + sequences /are/ needed however. + + - IL \033[L controls upwards scroll. + - XTERM \033[?1049[lh]: controls alternate screen (optional) + - DECTCEM (\033[?25[lh]): controls cursor visibility (optional) keybinds