From e0b26186f1d3c1a3a580eb7e8a8199c25536f4e6 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Tue, 26 Oct 1999 15:36:10 +0000 Subject: manual/8424 --- Completion/Commands/_bash_completions | 2 +- Completion/Commands/_history_complete_word | 123 +++++++++++++++++++++++------ Completion/Commands/_read_comp | 8 +- 3 files changed, 105 insertions(+), 28 deletions(-) (limited to 'Completion/Commands') diff --git a/Completion/Commands/_bash_completions b/Completion/Commands/_bash_completions index 5f3adc1e0..ee663fc30 100644 --- a/Completion/Commands/_bash_completions +++ b/Completion/Commands/_bash_completions @@ -30,7 +30,7 @@ local key=$KEYS[-1] case $key in '!') _main_complete _command_names ;; - '$') compgen -E + '$') compadd - "${(@k)parameters[(R)*export*]}" ;; '@') _main_complete _hosts ;; diff --git a/Completion/Commands/_history_complete_word b/Completion/Commands/_history_complete_word index f459046d2..1112339af 100644 --- a/Completion/Commands/_history_complete_word +++ b/Completion/Commands/_history_complete_word @@ -1,31 +1,108 @@ -#compdef -k complete-word \e/ +#compdef -K _history-complete-older complete-word \e/ _history-complete-newer complete-word \e, +# +# Complete words from the history +# +# by Adam Spiers, with help gratefully received from +# Sven Wischnowsky and Bart Schaefer +# +# Available configuration keys: +# +# history_list -- display lists of available matches +# history_stop -- prevent looping at beginning and end of matches +# during menu-completion +# history_sort -- sort matches lexically (default is to sort by age) +# history_remove_all_dups -- +# remove /all/ duplicate matches rather than just +# consecutives +# -local expl +_history_complete_word () { + local expl direction -if [[ -n "$compstate[old_list]" && -n "$compconfig[history_stop]" ]]; then - if [[ -z "$_hist_menu_end" && - compstate[old_insert] -lt _hist_menu_length ]]; then - compstate[old_list]=keep - compstate[insert]=$((compstate[old_insert]+1)) + if [[ $WIDGET = *newer ]]; then + direction=older else - _hist_menu_end=yes - if [[ "$compconfig[history_stop]" = verbose ]]; then - _message 'end of history reached' - else - compstate[old_list]=keep - compstate[insert]=_hist_menu_length + direction=newer + fi + + [[ -z "$compconfig[history_list]" ]] && compstate[list]='' + + if [[ -n "$compstate[old_list]" && + ( -n "$compconfig[history_stop]" || "$compstate[insert]" = menu ) ]]; then + # array of matches is newest -> oldest (reverse of history order) + if [[ "$direction" == 'older' ]]; then + if [[ compstate[old_insert] -eq $_hist_menu_length || + "$_hist_stop" == 'oldest' ]]; then + _hist_stop='oldest' + [[ "$compconfig[history_stop]" = verbose ]] && + _message 'beginning of history reached' + elif [[ "$_hist_stop" == 'newest' ]]; then + zle -Rc + _history_complete_word_gen_matches + else + compstate[old_list]=keep + (( compstate[insert] = compstate[old_insert] + 1 )) + fi + elif [[ "$direction" == 'newer' ]]; then + if [[ compstate[old_insert] -eq 1 || "$_hist_stop" == 'newest' ]]; then + _hist_stop='newest' + [[ "$compconfig[history_stop]" = verbose ]] && + _message 'end of history reached' + elif [[ "$_hist_stop" == 'oldest' ]]; then + zle -Rc + _history_complete_word_gen_matches + else + compstate[old_list]=keep + (( compstate[insert] = compstate[old_insert] - 1 )) + fi fi + else + _hist_stop='' + _hist_old_prefix="$PREFIX" + _history_complete_word_gen_matches fi -else - if [[ -n "$compconfig[history_sort]" ]]; then - _description expl 'history word' + + [[ -n "$compstate[nmatches]" ]] +} + +_history_complete_word_gen_matches () { + if [[ -n "$compconfig[history_list]" ]]; then + if [[ -n "$compconfig[history_sort]" ]]; then + _description expl 'history word' + else + _description -V expl 'history word' + fi else - _description -V expl 'history word' + if [[ -n "$compconfig[history_sort]" ]]; then + expl=() + else + expl=('-V' '') + fi fi - compgen "$expl[@]" -Q -H 0 '' - if [[ -n "$compconfig[history_stop]" ]]; then - compstate[insert]=1 - _hist_menu_length="$compstate[nmatches]" - _hist_menu_end='' + + [[ -n "$_hist_stop" ]] && PREFIX="$_hist_old_prefix" + + local rem_dups + if [[ -n "$compconfig[history_remove_all_dups]" ]]; then + rem_dups='' + else + rem_dups='-1' fi -fi + + compadd "$expl[@]" $rem_dups -Q - "${(@)historywords:#[\$'\"]*}" + + _hist_menu_length="$compstate[nmatches]" + + case "$direction" in + newer) compstate[insert]=$_hist_menu_length + [[ -n "$_hist_stop" ]] && (( compstate[insert]-- )) + ;; + older) compstate[insert]=1 + [[ -n "$_hist_stop" ]] && (( compstate[insert]++ )) + ;; + esac + + [[ -n "$_hist_stop" ]] && _hist_stop='' +} + +_history_complete_word "$@" diff --git a/Completion/Commands/_read_comp b/Completion/Commands/_read_comp index a32879b56..8a46d8af2 100644 --- a/Completion/Commands/_read_comp +++ b/Completion/Commands/_read_comp @@ -6,9 +6,9 @@ # evaluate to generate the completions; unambiguous strings in the function # name are automatically completed. # -# Else it is taken to be a set of arguments for compgen to generate a list +# Else it is taken to be a set of arguments for compadd to generate a list # of choices. The possibilities are the same as the flags for generating -# completions given in the zshcompctl manual page. Note the arguments are +# completions given in the zshcompwid manual page. Note the arguments are # verbatim: include minus signs, spaces, quotes, etc. # # On subsequent calls, the same completion will be re-performed. To @@ -37,7 +37,7 @@ if [[ compstate[matcher] -gt 1 || if [[ $_read_comp = _* ]]; then eval $_read_comp else - eval "compgen $_read_comp" + eval "compadd $_read_comp" fi return fi @@ -154,5 +154,5 @@ zle -cR '' if [[ $str = _* ]]; then eval $str else - eval "compgen $str" + eval "compadd $str" fi -- cgit 1.4.1