From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27794 invoked from network); 28 Mar 2001 12:15:40 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 28 Mar 2001 12:15:40 -0000 Received: (qmail 25111 invoked by alias); 28 Mar 2001 12:15:32 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 13815 Received: (qmail 25099 invoked from network); 28 Mar 2001 12:15:32 -0000 Date: Wed, 28 Mar 2001 14:15:32 +0200 (MET DST) Message-Id: <200103281215.OAA17205@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.dk In-reply-to: "Bart Schaefer"'s message of Tue, 27 Mar 2001 17:27:03 +0000 Subject: PATCH: Re: Completing strings from history? Bart Schaefer wrote: > On Mar 27, 11:13am, Sven Wischnowsky wrote: > } Subject: PATCH: Re: Completing strings from history? > } > } Ok, below is my first attempt at making _history_complete_words > } smarter. I didn't integrate Bart's changes, maybe that should be > } done. > } > } The behaviour is now to stop at the beginning/end once. Going up or > } down in the previously used direction will wrap around. > > If it does that, then it's not necessary to integrate my changes; mine > simply caused it to cycle without pausing. > > } I hope with the style settings Bart and Adam reported the behaviour is > } now good enough... > > I haven't tried it yet, but shouldn't there be some way to turn on menu > behavior with a style rather than requiring `setopt menucomplete'? I need comments from Adam about all the things I'm doing to his function... This patch changes things some more: - the stop style is now boolean; if `true' it will make _h_c_w stop once before wrapping around, otherwise it wraps immediately, as in a menu completion - menu behaviour is now selected using the `menu' style or the options (this is actually just an effect of looking at what _main_complete did) - the list style is only used if it is set to `false'; then the list will not be shown, otherwise this is selected with the options as usual The function now shows some kind of automatic automenu behaviour which seems to be sensible for this function (and doesn't get in the way anyway, I think). Plus this now uses the _history completer to do the work (that contains code originally take from _h_c_w). This is now almost a model of what could be possible with menu completion implemented in shell code... Bye Sven Index: Completion/Commands/_history_complete_word =================================================================== RCS file: /cvsroot/zsh/zsh/Completion/Commands/_history_complete_word,v retrieving revision 1.11 diff -u -r1.11 _history_complete_word --- Completion/Commands/_history_complete_word 2001/03/27 09:14:52 1.11 +++ Completion/Commands/_history_complete_word 2001/03/28 12:13:21 @@ -7,9 +7,8 @@ # # Available styles: # -# list -- display lists of available matches -# stop -- prevent looping at beginning and end of matches during -# menu-completion +# list -- avoid to display lists of available matches +# stop -- stop before looping at beginning and end of matches # sort -- sort matches lexically (default is to sort by age) # remove-all-dups -- # remove /all/ duplicate matches rather than just consecutives @@ -19,7 +18,6 @@ setopt localoptions ${_comp_options[@]} local expl direction stop curcontext="$curcontext" - local max slice hmax=$#historywords if [[ -z "$curcontext" ]]; then curcontext=history-words::: @@ -33,26 +31,12 @@ direction=older fi - zstyle -s ":completion:${curcontext}:history-words" stop stop + zstyle -t ":completion:${curcontext}:history-words" stop && stop=yes - zstyle -t ":completion:${curcontext}:history-words" list || compstate[list]='' + zstyle -T ":completion:${curcontext}:history-words" list || compstate[list]='' - if zstyle -s ":completion:${curcontext}:history-words" range max; then - if [[ $max = *:* ]]; then - slice=${max#*:} - max=${max%:*} - else - slice=$max - fi - [[ max -gt hmax ]] && max=$hmax - else - max=$hmax - slice=$max - fi - - if [[ ( -n "$compstate[old_list]" || - ( $LASTWIDGET = _history-complete-* && -n $_hist_stop ) ) && - ( -n "$stop" || "$compstate[insert]" = menu ) ]]; then + if [[ $LASTWIDGET = _history-complete-* && + ( -n "$compstate[old_list]" || -n $_hist_stop ) ]]; then if [[ "$direction" == older ]]; then if [[ $_hist_stop = new ]]; then PREFIX=$_hist_old_prefix @@ -67,10 +51,13 @@ elif [[ compstate[old_insert] -lt _hist_menu_length ]]; then compstate[old_list]=keep (( compstate[insert] = compstate[old_insert] + 1 )) - else + elif [[ -n $stop ]]; then _hist_stop=old _message 'beginning of history reached' return 1 + else + compstate[old_list]=keep + compstate[insert]=1 fi elif [[ "$direction" == 'newer' ]]; then if [[ $_hist_stop = old ]]; then @@ -86,10 +73,13 @@ elif [[ compstate[old_insert] -gt 1 ]]; then compstate[old_list]=keep (( compstate[insert] = compstate[old_insert] - 1 )) - else + elif [[ -n $stop ]]; then _hist_stop=new _message 'end of history reached' return 1 + else + compstate[old_list]=keep + compstate[insert]=$_hist_menu_length fi fi return 0 @@ -103,47 +93,29 @@ } _history_complete_word_gen_matches () { - local opt beg=2 [[ -n "$_hist_stop" ]] && PREFIX="$_hist_old_prefix" - if zstyle -t ":completion:${curcontext}:history-words" remove-all-dups; then - opt=- - else - opt=-1 - fi - if zstyle -t ":completion:${curcontext}:history-words" sort; then - opt="${opt}J" - else - opt="${opt}V" - fi - - PREFIX="$IPREFIX$PREFIX" - IPREFIX= - SUFFIX="$SUFFIX$ISUFFIX" - ISUFFIX= - - while [[ $compstate[nmatches] -eq 0 && beg -lt max ]]; do - _main_complete - history _wanted "$opt" history-words expl 'history word' \ - compadd -Q -a 'historywords[beg,beg+slice]' - (( beg+=slice )) - done + _main_complete _history - zstyle -t ":completion:${curcontext}:history-words" list || - compstate[list]= + zstyle -T ":completion:${curcontext}:history-words" list || compstate[list]= _hist_menu_length="$compstate[nmatches]" + + if [[ $_lastcomp[insert] != *unambig* ]]; then + case "$direction" in + newer) compstate[insert]=$_hist_menu_length + [[ -n "$_hist_stop" ]] && (( compstate[insert]-- )) + ;; + older) compstate[insert]=1 + [[ -n "$_hist_stop" ]] && (( compstate[insert]++ )) + ;; + esac + fi - case "$direction" in - newer) compstate[insert]=$_hist_menu_length - [[ -n "$_hist_stop" ]] && (( compstate[insert]-- )) - ;; - older) compstate[insert]=1 - [[ -n "$_hist_stop" ]] && (( compstate[insert]++ )) - ;; - esac + _hist_stop= - [[ -n "$_hist_stop" ]] && _hist_stop='' + return } _history_complete_word "$@" Index: Doc/Zsh/compsys.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v retrieving revision 1.113 diff -u -r1.113 compsys.yo --- Doc/Zsh/compsys.yo 2001/03/28 11:26:06 1.113 +++ Doc/Zsh/compsys.yo 2001/03/28 12:13:24 @@ -1470,9 +1470,11 @@ ) kindex(list, completion style) item(tt(list))( -This style is used by the tt(_history_complete_word) bindable command to -decide if the available matches should be shown. Use the context prefix -`tt(:completion:history-words)'. +This style is used by the tt(_history_complete_word) bindable command. +If it is set to `true' it has no effect, but if it is set to `false' +the matches will not be listed, overriding the setting of the options +that control listing behaviour, especially tt(AUTO_LIST). Use the +context prefix `tt(:completion:history-words)'. ) kindex(list-colors, completion style) item(tt(list-colors))( @@ -1917,10 +1919,11 @@ kindex(stop, completion style) item(tt(stop))( If set to `true', the tt(_history_complete_word) bindable -command will always insert matches as if menu completion were started -and will stop when the last match is inserted. If this style is set -to `tt(verbose)' a message will be displayed when the last match is -reached. +command will stop once when reaching the beginning or end of the +history. Invoking tt(_history_complete_word) will then wrap around to +the opposite end of the history. If this style is set to `false' (the +default), tt(_history_complete_word) will loop immediately as in a +menu completion. ) kindex(subst-globs-only, completion style) item(tt(subst-globs-only))( -- Sven Wischnowsky wischnow@informatik.hu-berlin.de