Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: Re: Completing strings from history?
- X-seq: zsh-workers 13815
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: PATCH: Re: Completing strings from history?
- Date: Wed, 28 Mar 2001 14:15:32 +0200 (MET DST)
- In-reply-to: "Bart Schaefer"'s message of Tue, 27 Mar 2001 17:27:03 +0000
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
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@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author