Hello Bart, Thanks a lot for responding. I find your comments very informative and a treasure trove for me. > Some brief critique: > > (1) It's annoying to use application/octet-stream for text attachments. > This probably isn't your fault, you just have a broken email program, > or you haven't told it that the ".zsh" extension means a text type. gmail is adding application/octet-stream. I will send both the .zsh file and a .txt file. > (2) In this line in list-completion: > > if ((compstate[list_lines] > ${INCR_MAX_MATCHES:-20} \ > || compstate[list_lines]+BUFFERLINES+2 > LINES)) > > The backslash-continuation is not necessary, "((" begins a syntactic > construct which continues even across newlines to the matching "))". On a slightly different note, I do not feel comfortable using the (( .. )) construct as it does not show up properly in the xtrace/verbose log. This is how it shows up. +limit-completion:21> (( compstate[list_lines] > 60 || compstate[list_lines]+BUFFERLINES+2 > LINES )) whereas the [[ .. ]] construct shows up like this: +limit-completion:23> [[ 7 -gt 60 ||+limit-completion:23> expr 7 + 2 + 2 +limit-completion:23> [[ 7 -gt 60 || 11 -gt 47 ]] I think the [[ .. ]] is more comprehensible. > setopt localoptions; unsetopt BANG_HIST > > However, locally unsetting BANG_HIST is the correct solution to the > problem you were having, so good job figuring that out. Fixed it. I picked the above localoptions from your earlier code on _debug_widget. I could not figure out why the below lines do not work. They return a blank. echo "4: $(expr ${compstate[list_lines]})" echo "5: $(expr $compstate[list_lines])" echo "6: $(expr $compstate[list_lines] + $BUFFERLINES)" echo "7: $(expr $compstate[list_lines] + $BUFFERLINES + 2)" They are in lines 42 .. 45 of the attached script. The debugging output from the lines 35 .. 57 of the attached file is: +limit-completion:7> echo 'started limit-completion' started limit-completion +limit-completion:8> echo 'compstate[list_lines]: 8' compstate[list_lines]: 8 +limit-completion:9> echo 'INCR_MAX_MATCHES: 60' INCR_MAX_MATCHES: 60 +limit-completion:10> echo 'BUFFERLINES: 2' BUFFERLINES: 2 +limit-completion:11> echo 'list_lines: 8' list_lines: 8 +limit-completion:12> expr 8 + 2 + 2 +limit-completion:12> echo 'expr list_lines: 12' expr list_lines: 12 +limit-completion:13> echo '----- no idea why these below lines do not work' ----- no idea why these below lines do not work +limit-completion:14> echo '4: ' 4: +limit-completion:15> echo '5: ' 5: +limit-completion:16> echo '6: ' 6: +limit-completion:17> echo '7: ' 7: +limit-completion:18> echo '----- no idea why the above lines do not work' ----- no idea why the above lines do not work +limit-completion:19> echo 'LINES: 47' LINES: 47 +limit-completion:20> echo 'ended limit-completion' ended limit-completion +limit-completion:23> [[ 8 -gt 60 ||+limit-completion:23> expr 8 + 2 + 2 +limit-completion:23> [[ 8 -gt 60 || 12 -gt 47 ]] Whereas, when I tried the associative array workings from the command line, it worked fine: - (0:c:/tmp) - - - - - - - - - - - - - - - typeset -A NAME - (0:c:/tmp) - - - - - - - - - - - - - - - NAME=(test1 1 test2 2 test3 3 test4 4) - (0:i:/tmp) - - - - - - - - - - - - - - - echo $NAME 1 2 3 4 - (0:i:/tmp) - - - - - - - - - - - - - - - echo $NAME[test1] 1 - (0:i:/tmp) - - - - - - - - - - - - - - - expr $NAME[test1] + 2 3 - (0:i:/tmp) - - - - - - - - - - - - - - - echo $(expr $NAME[test1] + 2) 3 - (0:i:/tmp) - - - - - - - - - - - - - - - echo "$(expr $NAME[test1] + 2)" 3 Any thoughts, please? Thanks Joe
#!/usr/bin/zsh # based on # incremental completion for zsh # by y.fujii <y-fujii at mimosa-pudica.net>, public domain # got the below alignment with # or, below # :11,12s/\s\+/ /g # '<,'>Tabularize /\s/l0c0 zle -N self-insert self-insert-incr # zle -N vi-backward-delete-char-incr # bindkey -M viins '^h' vi-backward-delete-char-incr # bindkey -M viins '^?' vi-backward-delete-char-incr # to increase the incr-0.2 max matches export INCR_MAX_MATCHES=60 # function limit-completion () { # if ((compstate[nmatches] <= 1)); then # zle -M "" # elif ((compstate[list_lines] > ${INCR_MAX_MATCHES:-20})); then # compstate[list]="" # zle -M "too many matches." # fi # } function limit-completion () { # got the line comparing with LINES from # /usr/share/zsh/5.0.2/functions/Zle/incremental-complete-word local list_lines list_lines=$compstate[list_lines] { setopt localoptions xtrace verbose echo "started limit-completion" echo "compstate[list_lines]: $compstate[list_lines]" echo "INCR_MAX_MATCHES: ${INCR_MAX_MATCHES:-20}" echo "BUFFERLINES: $BUFFERLINES" echo "list_lines: $list_lines" echo "expr list_lines: $(expr $list_lines + $BUFFERLINES + 2)" echo "----- no idea why these below lines do not work" echo "4: $(expr ${compstate[list_lines]})" echo "5: $(expr $compstate[list_lines])" echo "6: $(expr $compstate[list_lines] + $BUFFERLINES)" echo "7: $(expr $compstate[list_lines] + $BUFFERLINES + 2)" echo "----- no idea why the above lines do not work" echo "LINES: $LINES" echo "ended limit-completion" # if ((compstate[list_lines] > ${INCR_MAX_MATCHES:-20} \ # || compstate[list_lines]+BUFFERLINES+2 > LINES)) if [[ "$list_lines" -gt "${INCR_MAX_MATCHES:-20}" \ || $(expr $list_lines + $BUFFERLINES + 2) -gt "$LINES" ]] then compstate[list]='' zle -M "too many matches." fi } 2>>| /tmp/zsh-limit-completion.log 1>&2 } function self-insert-incr () { # echo "started self-insert-incr" if zle .self-insert; then show-choices # complete-word-incr fi } function vi-backward-delete-char-incr () { if zle vi-backward-delete-char; then show-choices # complete-word-incr fi } function show-choices () { # local cursor_org # local buffer_org # local cursor_now # local buffer_now # cursor_org="$CURSOR" # buffer_org="$BUFFER" # if [[ "$BUFFER[1]" != "!" ]] # echo $widgets[list-choices] # user:_zsh_highlight_widget_list-choices # mv 91-history-substring-search.zsh \ # 91-history-substring-search.zsh.disable # rm 90-syntax.zsh # echo $widgets[list-choices] # completion:.list-choices:_main_complete # compinit is redirecting list-choices to _main_complete # and the _normal called by _main_complete is doing a # bang expansion as soon as it sees a ! in the string # Hence, do not call list-choices if there is a ! in that line # or, instead of filtering $BUFFER on !, unsetopt BANG_HIST # as list-choices is checking on BANG_HIST before expanding # the !. # if [[ "$BUFFER" != *\!* && \ setopt localoptions unsetopt BANG_HIST # setopt xtrace verbose # do not list-choices if there is a ! in that word # but, as I could not figure out the word vs line, # just skipping on any line with a ! # do not list-choices if it is a paste, pending > 0 in such cases # do not list-choices if editing in the middle of a word if [[ "$BUFFER" != *\!* \ && "$PENDING" -eq 0 \ && ( -z "$RBUFFER" || "$RBUFFER[1]" == ' ' ) \ ]] then comppostfuncs=(limit-completion) zle list-choices fi # cursor_now="$CURSOR" # buffer_now="$BUFFER" } function complete-word-incr () { local cursor_org local buffer_org local cursor_now local buffer_now local lbuffer_now cursor_org="$CURSOR" buffer_org="$BUFFER" comppostfuncs=(limit-completion) zle complete-word cursor_now="$CURSOR" buffer_now="$BUFFER" lbuffer_now="$LBUFFER" # if [ "$cursor_now" -gt "$cursor_org" \ # -a "$buffer_org[1,cursor_org]" == "$buffer_now[1,cursor_org]" \ # -a "$lbuffer_now[-1]" == " " ] # then # CURSOR="$cursor_org" # fi } # vim: set filetype=zsh shiftwidth=3 tabstop=3 expandtab fileformat=unix
Attachment:
80-auto-list-choices.zsh
Description: Binary data