Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: auto list choices



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



Messages sorted by: Reverse Date, Date, Thread, Author