# Tests for region_highlight, true-color support, near-color support %prep if [[ $OSTYPE == cygwin ]]; then ZTST_unimplemented='the zsh/zpty module does not work on Cygwin' elif zmodload zsh/zpty 2> /dev/null; then zpty_start() { export PS1= PS2= zpty -d zpty zsh "${(q)ZTST_testdir}/../Src/zsh -fiV" } zpty_input() { zpty -w zsh "$1" ${${(M)2:#nl}:+$'\n'} } zpty_line() { setopt localoptions extendedglob noshwordsplit local REPLY cm=$'\r' integer i for (( i = 0; i < ${1:-1}; ++i )); do zpty -r zsh REPLY # P is for "preserve", induces keeping some # color codes to test region_highlight, etc. # The color codes are then made regular text [[ "$2" = "p" ]] && { print -rl -- "$REPLY" >> /tmp/output # THE LINE REPLY=${REPLY//$'\x1b'\[([2][0-9;]m|[JK]|\?[0-9]##(h|l))/} REPLY=${REPLY//(#b)$'\x1b'\[([0-9;]##m)/${match[1]}} } || { REPLY=${REPLY//$'\x1b'\[([0-9;]##m|[JK]|\?[0-9]##(h|l))/} } # Fix e^Mexit - match ((?)\r(?)), if \2 == \3, then replace with \2 # otherwise replace with \1 stripped out of leading/trailing [[:space:]] REPLY=${REPLY//(#b)((?(#c0,1))$cm(?(#c0,1)))/${${${(M)match[2]:#${match[3]}}:+${match[2]}}:-${${match[1]##[[:space:]]##}%%[[:space:]]##}}} [[ -n "$REPLY" ]] && print -r -- ${${REPLY%%[[:space:]]##}##[[:space:]]##} done } zpty_stop() { setopt localoptions extendedglob local REPLY cm=$'\r' zpty -w zsh $'exit\n' # zpty gives no output when piped without these braces (?) # The while loop with // substitution is to convert `e^Mexit' # into `exit' (see zpty_line). The sed commands remove escapes { zpty -r zsh } | sed $'/[^[:space:]]/!d; s/\r$//; s/\x1b\\[[0-9;]*m//g; s/\x1b\\[[JK]//g; s/\x1b\\[?[0-9]*[hl]//g' | while read REPLY; do REPLY=${REPLY//(#b)((?(#c0,1))$cm(?(#c0,1)))/${${${(M)match[2]:#${match[3]}}:+${match[2]}}:-${${match[1]##[[:space:]]##}%%[[:space:]]##}}}; print -r -- "$REPLY"; done zpty -d : } else ZTST_unimplemented='the zsh/zpty module is not available' fi %test zpty_start zpty_input 'rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=green" ); }' zpty_input 'zle -N rh_widget' zpty_input 'bindkey "\C-a" rh_widget' zpty_input $'\C-a' zpty_line 3 zpty_line 1 p zpty_stop 0:basic region_highlight with 8 colors >rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=green" ); } >zle -N rh_widget >bindkey "\C-a" rh_widget >0m32mtrue39m >exit zpty_start zpty_input 'rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#040810" ); }' nl zpty_input 'zle -N rh_widget' nl zpty_input 'bindkey "\C-a" rh_widget' nl zpty_input $'\C-a' zpty_line 6 # 3 lines echoed back + 3 empty lines (TODO: wrong -n use) zpty_line 1 p zpty_stop 0:basic region_highlight with true-color (hex-triplets) >rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#040810" ); } >zle -N rh_widget >bindkey "\C-a" rh_widget >0m38;2;4;8;16mtrue39m >exit zpty_start zpty_input 'zmodload zsh/nearcolor' nl zpty_input 'rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#040810" ); }' nl zpty_input 'zle -N rh_widget' nl zpty_input 'bindkey "\C-a" rh_widget' nl zpty_input $'\C-a' zpty_line 8 # 5 lines echoed back + 5 empty lines (TODO: wrong -n use) zpty_line 1 p zpty_input 'zmodload -u zsh/nearcolor' nl zpty_line 2 zpty_stop 0:basic region_highlight with near-color (hex-triplets at input) >zmodload zsh/nearcolor >rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#040810" ); } >zle -N rh_widget >bindkey "\C-a" rh_widget >0m38;5;232mtrue39m >zmodload -u zsh/nearcolor >exit zpty_start zpty_input 'rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=green" ); rh2; }' zpty_input 'rh2() { region_highlight+=( "1 2 fg=red" ); }' # `r' in red; the above line would be too long zpty_input 'zle -N rh_widget' zpty_input 'bindkey "\C-a" rh_widget' zpty_input $'\C-a' zpty_line 4 zpty_line 1 p zpty_stop 0:overlapping region_highlight with 8 colors >rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=green" ); rh2; } >rh2() { region_highlight+=( "1 2 fg=red" ); } >zle -N rh_widget >bindkey "\C-a" rh_widget >0m32mt31mr39m32mue39m >exit zpty_start zpty_input 'rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#00cc00" ); rh2; }' zpty_input 'rh2() { region_highlight+=( "1 2 fg=#cc0000" ); }' # `r' in red; the above line would be too long zpty_input 'zle -N rh_widget' zpty_input 'bindkey "\C-a" rh_widget' zpty_input $'\C-a' zpty_line 4 zpty_line 1 p zpty_stop 0:overlapping region_highlight with true-color >rh_widget() { BUFFER="true"; region_highlight+=( "0 4 fg=#00cc00" ); rh2; } >rh2() { region_highlight+=( "1 2 fg=#cc0000" ); } >zle -N rh_widget >bindkey "\C-a" rh_widget >0m32mt31mr39m32mue39m >exit %clean zmodload -ui zsh/zpty # vim:ft=zsh