From 8b53e5de541bcdb93502acc31177755082e513b5 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Mon, 13 Mar 2000 10:26:17 +0000 Subject: zsh-workers/10108 --- Completion/Commands/.distfiles | 1 + Completion/Commands/_next_tags | 70 ++++++++++++++++++++++++++++++++++++++++++ Completion/Core/_files | 2 +- Completion/Core/_main_complete | 5 +-- Completion/Core/_requested | 2 +- Completion/Core/_wanted | 5 +-- Doc/Zsh/compsys.yo | 12 ++++++++ Functions/Misc/.distfiles | 2 +- 8 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 Completion/Commands/_next_tags diff --git a/Completion/Commands/.distfiles b/Completion/Commands/.distfiles index 804e65be3..45378a009 100644 --- a/Completion/Commands/.distfiles +++ b/Completion/Commands/.distfiles @@ -2,4 +2,5 @@ DISTFILES_SRC=' .distfiles _bash_completions _correct_filename _correct_word _expand_word _history_complete_word _read_comp _most_recent_file _complete_help + _next_tags ' diff --git a/Completion/Commands/_next_tags b/Completion/Commands/_next_tags new file mode 100644 index 000000000..8bd3f5921 --- /dev/null +++ b/Completion/Commands/_next_tags @@ -0,0 +1,70 @@ +#compdef -k complete-word \C-xn + +# Main widget/completer. + +_next_tags() { + + if [[ $#funcstack -gt 1 ]]; then + + # Called as completer, probably `remove' our helper function. A better + # test would be nice, but I think one should still be able to edit the + # current word between attempts to complete it. + + [[ $_next_tags_pre != ${LBUFFER%${PREFIX}} ]] && unset _sort_tags + + return 1 + else + local comp + + if [[ -z $compstate[old_list] ]]; then + comp=() + else + comp=(_next_tags _complete) + fi + + (( $+_sort_tags )) || _next_tags_not= + + _sort_tags=_next_tags_sort + _next_tags_pre="${LBUFFER%${PREFIX}}" + _next_tags_not="$_next_tags_not $_lastcomp[tags]" + + _main_complete "$comp[@]" + + [[ $compstate[insert] = automenu ]] && + compstate[insert]=automenu-unambiguous + + compstate[insert]='' + compstate[list]='list force' + fi +} + +# Helper function for sorting tags. Most of this is copied from _tags. + +_next_tags_sort() { + local order tags tag nodef + + zstyle -a ":completion:${curcontext}:" tag-order order || + order=( 'arguments values' options globbed-files directories all-files ) + + # But we also remove the tags we've already tried... + + tags=( "${(@)order:#(${(j:|:)~${=_next_tags_not}})}" ) + + # ... unless that would remove all offered tags. + + [[ $#tags -ne $#order && "$tags" != *(${(j:|:)~argv})* ]] && + tags=( $order ) _next_tags_not= + + for tag in $tags; do + case $tag in + -) nodef=yes;; + *\(\)) "${${tag%%[ ]#\(\)}##[ ]#}" "$@";; + \!*) comptry "${(@)argv:#(${(j:|:)~${=tag[2,-1]}})}";; + ?*) comptry ${=tag};; + esac + done + + [[ -z "$nodef" ]] && comptry "$@" +} + +[[ -o kshautoload ]] || _next_tags "$@" diff --git a/Completion/Core/_files b/Completion/Core/_files index 1e139bc6b..75cabda81 100644 --- a/Completion/Core/_files +++ b/Completion/Core/_files @@ -33,7 +33,7 @@ if zstyle -s ":completion:${curcontext}:directories" file-patterns tmp && type="${type}/" fi else - dopts=() + dopts=(-/) fi if zstyle -s ":completion:${curcontext}:globbed-files" file-patterns tmp && [[ -n "$tmp" ]]; then diff --git a/Completion/Core/_main_complete b/Completion/Core/_main_complete index d019351b9..a5af32f0f 100644 --- a/Completion/Core/_main_complete +++ b/Completion/Core/_main_complete @@ -21,7 +21,7 @@ unsetopt markdirs globsubst shwordsplit nounset ksharrays local ctxt post ret=1 tmp _compskip format _comp_ignore \ _completers _completer _completer_num \ - _matchers _matcher _matcher_num \ + _matchers _matcher _matcher_num _comp_tags \ context state line opt_args val_args curcontext="$curcontext" \ _last_nmatches=-1 _last_menu_style _def_menu_style _menu_style sel \ _saved_exact="${compstate[exact]}" \ @@ -193,12 +193,13 @@ done comppostfuncs=() _lastcomp=( "${(@kv)compstate}" ) -_lastcomp[completer]="$comp" +_lastcomp[completer]="$_completer" _lastcomp[prefix]="$PREFIX" _lastcomp[suffix]="$SUFFIX" _lastcomp[iprefix]="$IPREFIX" _lastcomp[isuffix]="$ISUFFIX" _lastcomp[qiprefix]="$QIPREFIX" _lastcomp[qisuffix]="$QISUFFIX" +_lastcomp[tags]="$_comp_tags" return ret diff --git a/Completion/Core/_requested b/Completion/Core/_requested index a582adfb9..b5efb5a9e 100644 --- a/Completion/Core/_requested +++ b/Completion/Core/_requested @@ -8,7 +8,7 @@ else tag="$1" fi -comptags -R "$tag" && +comptags -R "$tag" && _comp_tags="$_comp_tags $tag" && if [[ $# -gt 1 ]]; then _description "$@" return 0 diff --git a/Completion/Core/_wanted b/Completion/Core/_wanted index f95d74451..400daa701 100644 --- a/Completion/Core/_wanted +++ b/Completion/Core/_wanted @@ -19,7 +19,8 @@ else fi if [[ $# -gt 1 ]]; then - _tags "$targs[@]" "$tag" && _description "$@" + _tags "$targs[@]" "$tag" && _comp_tags="$_comp_tags $tag" && + _description "$@" else - _tags "$targs[@]" "$tag" + _tags "$targs[@]" "$tag" && _comp_tags="$_comp_tags $tag" fi diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo index cce2dcebf..13eebe7b1 100644 --- a/Doc/Zsh/compsys.yo +++ b/Doc/Zsh/compsys.yo @@ -1861,6 +1861,18 @@ on the command line (which may be blank). If given a numeric argument var(N), complete the var(N)th most recently modified file. Note the completion, if any, is always unique. ) +findex(_next_tags (^Xn)) +item(tt(_next_tags (^Xn)))( +This allows to complete types of matches that are not immediately +offered because of the setting of the tt(tag-order) style. After a +normal completion was tried, invoking this command makes the matches +for the next tag (or set of tags) be used. Repeatedly invoking this +command makes the following tags be used. To be able to complete the +matches selected by tt(_next_tags), the tt(completer) style should +contain tt(_next_tags) as its first string. With that, the normal key +binding (normally tt(TAB)) can be used to complete the matches shown +after the call to tt(_next_tags). +) findex(_read_comp (^X^R)) item(tt(_read_comp (^X^R)))( Prompt the user for a string, and use that to perform completion on the diff --git a/Functions/Misc/.distfiles b/Functions/Misc/.distfiles index e57056c03..f6a638658 100644 --- a/Functions/Misc/.distfiles +++ b/Functions/Misc/.distfiles @@ -2,5 +2,5 @@ DISTFILES_SRC=' .distfiles acx allopt cat cdmatch cdmatch2 checkmail colors cx harden is-at-least mere multicomp nslookup proto pushd randline - run-help yp yu zed zless zls zmv + run-help yp yu zed zless zls zmv zrecompile ' -- cgit 1.4.1