diff options
Diffstat (limited to 'Functions/Zle/incremental-complete-word')
-rw-r--r-- | Functions/Zle/incremental-complete-word | 91 |
1 files changed, 68 insertions, 23 deletions
diff --git a/Functions/Zle/incremental-complete-word b/Functions/Zle/incremental-complete-word index 2a9c1aff2..3831ecaa6 100644 --- a/Functions/Zle/incremental-complete-word +++ b/Functions/Zle/incremental-complete-word @@ -4,32 +4,55 @@ # to a key. # This allows incremental completion of a word. After starting this -# command, a list of completion choices is shown after every character you -# type, which you can delete with ^h or DEL. RET will accept the -# completion so far. You can hit TAB to do normal completion and ^g to -# abort back to the state when you started. +# command, a list of completion choices can be shown after every character +# you type, which you can delete with ^h or DEL. RET will accept the +# completion so far. You can hit TAB to do normal completion, ^g to +# abort back to the state when you started, and ^d to list the matches. # -# Completion keys: -# incremental_prompt Prompt to show in status line during icompletion; -# the sequence `%u' is replaced by the unambiguous -# part of all matches if there is any and it is -# different from the word on the line -# incremental_stop Pattern matching keys which will cause icompletion -# to stop and the key to be re-executed -# incremental_break Pattern matching keys which will cause icompletion -# to stop and the key to be discarded -# incremental_completer Set of completers, like the `completer' key -# incremental_list If set to a non-empty string, the matches will be -# listed on every key-press +# This works best with the new function based completion system. +# +# Configuration keys: +# +# incremental_prompt +# Prompt to show in status line during icompletion. The sequence `%u' +# is replaced by the unambiguous part of all matches if there is any +# and it is different from the word on the line. A `%s' is replaced +# with `-no match-', `-no prefix-', or an empty string if there is +# no completion matching the word on the line, if the matches have +# no common prefix different from the word on the line or if there is +# such a common prefix, respectively. The sequence `%c' is replaced +# by the name of the completer function that generated the matches +# (without the leading underscore). Finally, `%n' is replaced by the +# number of matches generated and `%a' is replaced by an empty string +# if the matches are in the normal set (i.e. the one without file names +# with one of the suffixes from `fignore') and with ` -alt-' if the +# matches are in the alternate set. +# +# incremental_stop +# Pattern matching keys which will cause icompletion to stop and the +# key to be re-executed. +# +# incremental_break +# Pattern matching keys which will cause icompletion to stop and the +# key to be discarded. +# +# incremental_completer +# Set of completers, like the `completer' key for normal completion. +# +# incremental_list +# If set to a non-empty string, the matches will be listed on every +# key-press. + emulate -L zsh unsetopt autolist menucomplete automenu # doesn't work well -local key lbuf="$LBUFFER" rbuf="$RBUFFER" pmpt word lastl lastr wid twid +local key lbuf="$LBUFFER" rbuf="$RBUFFER" pmpt word +local lastl lastr wid twid num alt [[ -n "$compconfig[incremental_completer]" ]] && -set ${(s.:.)compconfig[incremental_completer]} -pmpt="${compconfig[incremental_prompt]-incremental completion...}" + set ${(s.:.)compconfig[incremental_completer]} +pmpt="${compconfig[incremental_prompt]-incremental (%c): %u%s}" if [[ -n "$compconfig[incremental_list]" ]]; then wid=list-choices @@ -40,12 +63,22 @@ fi zle $wid "$@" LBUFFER="$lbuf" RBUFFER="$rbuf" -if [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then +if (( ! _lastcomp[nmatches] )); then + word='' + state='-no match-' +elif [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then word='' + state='-no prefix-' else word="${_lastcomp[unambiguous]}" + state='' +fi +num=$_lastcomp[normal_nmatches] +if (( ! num )); then + num="${_lastcomp[nmatches]}" + alt=' -alt-' fi -zle -R "${pmpt//\\%u/$word}" +zle -R "${${${${${pmpt//\\%u/$word}//\\%s/$state}//\\%c/${_lastcomp[completer][2,-1]}}//\\%n/$num}//\\%a/$alt}" read -k key while [[ '#key' -ne '#\\r' && '#key' -ne '#\\n' && @@ -72,12 +105,24 @@ while [[ '#key' -ne '#\\r' && '#key' -ne '#\\n' && zle $twid "$@" LBUFFER="$lastl" RBUFFER="$lastr" - if [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then + if (( ! _lastcomp[nmatches] )); then word='' + state='-no match-' + elif [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then + word='' + state='-no prefix-' else word="${_lastcomp[unambiguous]}" + state='' + fi + num=$_lastcomp[normal_nmatches] + if (( ! num )); then + num="${_lastcomp[nmatches]}" + alt=' -alt-' + else + alt='' fi - zle -R "${pmpt//\\%u/$word}" + zle -R "${${${${${pmpt//\\%u/$word}//\\%s/$state}//\\%c/${_lastcomp[completer][2,-1]}}//\\%n/$num}//\\%a/$alt}" read -k key done |