From: joe M <joe9mail@gmail.com>
To: Bart Schaefer <schaefer@brasslantern.com>
Cc: zsh-workers@zsh.org
Subject: Re: auto list choices
Date: Sun, 10 Mar 2013 00:45:56 -0500 [thread overview]
Message-ID: <CAHjjW14tznO=6eQpR2i=aKvPdAfQ_Ftwp8L2Tx0AY4vpDprxiQ@mail.gmail.com> (raw)
In-Reply-To: <130309072553.ZM19912@torch.brasslantern.com>
[-- Attachment #1: Type: text/plain, Size: 3729 bytes --]
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
[-- Attachment #2: 80-auto-list-choices.zsh.txt --]
[-- Type: text/plain, Size: 4354 bytes --]
#!/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 #3: 80-auto-list-choices.zsh --]
[-- Type: application/octet-stream, Size: 4354 bytes --]
#!/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
next prev parent reply other threads:[~2013-03-10 5:46 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-07 3:57 joe M
2013-03-07 4:23 ` joe M
2013-03-07 4:35 ` joe M
2013-03-08 15:48 ` joe M
2013-03-09 15:25 ` Bart Schaefer
2013-03-10 5:45 ` joe M [this message]
2013-03-10 18:23 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAHjjW14tznO=6eQpR2i=aKvPdAfQ_Ftwp8L2Tx0AY4vpDprxiQ@mail.gmail.com' \
--to=joe9mail@gmail.com \
--cc=schaefer@brasslantern.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).