comptestinit () { setopt extendedglob zmodload zsh/zpty || return $? comptest_zsh=${ZSH:-zsh} comptest_keymap=e while getopts vz: opt; do case $opt in z) comptest_zsh="$OPTARG";; v) comptest_keymap="v";; esac done (( OPTIND > 1 )) && shift $(( OPTIND - 1 )) export PS1="<PROMPT>" zpty zsh "$comptest_zsh -f +Z" zpty -r zsh log1 "*<PROMPT>*" || { print "first prompt hasn't appeared." return 1 } comptesteval \ "export LC_ALL=${ZSH_TEST_LANG:-C}" \ "emulate -R zsh" \ "export ZDOTDIR=$ZTST_testdir" \ "bindkey -$comptest_keymap" \ 'LISTMAX=10000000 stty 38400 columns 80 rows 24 tabs -icanon -iexten TERM=vt100 KEYTIMEOUT=1 setopt zle autoload -U compinit compinit -u zstyle ":completion:*:default" list-colors "no=<NO>" "fi=<FI>" "di=<DI>" "ln=<LN>" "pi=<PI>" "so=<SO>" "bd=<BD>" "cd=<CD>" "ex=<EX>" "mi=<MI>" "tc=<TC>" "sp=<SP>" "lc=<LC>" "ec=<EC>\n" "rc=<RC>" zstyle ":completion:*" group-name "" zstyle ":completion:*:messages" format "<MESSAGE>%d</MESSAGE> " zstyle ":completion:*:descriptions" format "<DESCRIPTION>%d</DESCRIPTION>" zstyle ":completion:*:options" verbose yes zstyle ":completion:*:values" verbose yes setopt noalwayslastprompt listrowsfirst completeinword zmodload zsh/complist expand-or-complete-with-report () { print -lr "<WIDGET><expand-or-complete>" zle expand-or-complete print -lr - "<LBUFFER>$LBUFFER</LBUFFER>" "<RBUFFER>$RBUFFER</RBUFFER>" zle clear-screen zle -R } list-choices-with-report () { print -lr "<WIDGET><list-choices>" zle list-choices zle clear-screen zle -R } comp-finish () { print "<WIDGET><finish>" zle kill-whole-line zle clear-screen zle -R } zle-finish () { local buffer="$BUFFER" cursor="$CURSOR" mark="$MARK" (( region_active)) || unset mark BUFFER="" zle -I zle clear-screen zle redisplay print -lr "<WIDGET><finish>" "BUFFER: $buffer" "CURSOR: $cursor" (( $+mark )) && print -lr "MARK: $mark" zle accept-line } zle -N expand-or-complete-with-report zle -N list-choices-with-report zle -N comp-finish zle -N zle-finish bindkey "^I" expand-or-complete-with-report bindkey "^D" list-choices-with-report bindkey "^Z" comp-finish bindkey "^X" zle-finish bindkey -a "^X" zle-finish ' } zpty_flush() { local junk if zpty -r -t zsh junk \*; then (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "$*: ${(V)junk}" while zpty -r -t zsh junk \* ; do (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "${(V)junk}" done (( ZTST_verbose > 2 )) && print -u $ZTST_fd '' fi } zpty_run() { zpty -w zsh "$*" zpty -r -m zsh log "*<PROMPT>*" || { print "prompt hasn't appeared." return 1 } } comptesteval () { local tmp=/tmp/comptest.$$ print -lr - "$@" > $tmp # zpty_flush Before comptesteval zpty -w zsh ". $tmp" zpty -r -m zsh log_eval "*<PROMPT>*" || { print "prompt hasn't appeared." return 1 } zpty_flush After comptesteval rm $tmp } comptest () { input="$*" zpty -n -w zsh "$input"$'\C-Z' zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || { print "failed to invoke finish widget." return 1 } logs=(${(s:<WIDGET>:)log}) shift logs for log in "$logs[@]"; do if [[ "$log" = (#b)*$'<LBUFFER>'(*)$'</LBUFFER>\r\n<RBUFFER>'(*)$'</RBUFFER>'* ]]; then print -lr "line: {$match[1]}{$match[2]}" fi while (( ${(N)log#*(#b)(<LC><(??)><RC>(*)<EC>|<DESCRIPTION>(*)</DESCRIPTION>|<MESSAGE>(*)</MESSAGE>|<COMPADD>(*)</COMPADD>|<INSERT_POSITIONS>(*)</INSERT_POSITIONS>|<QUERY>(*)</QUERY>|<WARN>(*)</WARN>)} )); do log="${log[$mend[1]+1,-1]}" if (( 0 <= $mbegin[2] )); then if [[ $match[2] != TC && $match[3] != \ # ]]; then print -lr "$match[2]:{${match[3]%${(%):-%E}}}" fi elif (( 0 <= $mbegin[4] )); then print -lr "DESCRIPTION:{$match[4]}" elif (( 0 <= $mbegin[5] )); then print -lr "MESSAGE:{$match[5]}" elif (( 0 <= $mbegin[6] )); then print -lr "COMPADD:{${${match[6]}//[$'\r\n']/}}" elif (( 0 <= $mbegin[7] )); then print -lr "INSERT_POSITIONS:{${${match[7]}//[$'\r\n']/}}" elif (( 0 <= $mbegin[8] )); then print -lr "QUERY:{${match[8]}}" elif (( 0 <= $mbegin[9] )); then print -lr "WARN:{${match[9]}}" fi done done } zletest () { local first=0 for input; do # zpty_flush Before zletest # sleep for $KEYTIMEOUT (( first++ )) && { sleep 2 & } | read -t 0.011 -u 0 -k 1 zpty -n -w zsh "$input" done zpty -n -w zsh $'\C-X' zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || { print "failed to invoke finish widget." return 1 } # zpty_flush After zletest print -lr "${(@)${(@ps:\r\n:)log##*<WIDGET><finish>}[2,-2]}" }