diff options
Diffstat (limited to 'Functions/Zle')
-rw-r--r-- | Functions/Zle/quote-and-complete-word | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/Functions/Zle/quote-and-complete-word b/Functions/Zle/quote-and-complete-word new file mode 100644 index 000000000..e2646dbaa --- /dev/null +++ b/Functions/Zle/quote-and-complete-word @@ -0,0 +1,46 @@ +#autoload + +# This widget uses the completion system to double-quote the current word +# if it is not already quoted, then attempts to complete normally. If the +# normal completion fails, the quotes are removed again. +# +# To use it: +# autoload -U quote-and-complete-word +# zle -N quote-and-complete-word +# bindkey '\t' quote-and-complete-word +# +# BUG: The "undo" mechanism is confused by multiple calls to completion +# widgets from the same normal widget. + +# Note: It's important that this function's name ends in "complete-word". +# The _oldlist completer does nothing unless the widget has that suffix. + +quote-and-complete-word () { + setopt localoptions unset noshwordsplit noksharrays + local lbuf=$LBUFFER rbuf=$RBUFFER last=$LASTWIDGET + if [[ $last != $WIDGET ]] + then + local oldcontext=$curcontext + local curcontext="${WIDGET}:${${curcontext:-:::}#*:}" + zle complete-word + curcontext=$oldcontext + fi + zle complete-word + local ret=$? + if [[ _lastcomp[nmatches] -eq 0 && $last != $WIDGET ]] + then + LBUFFER=$lbuf RBUFFER=$rbuf + fi + return ret +} + +_force_quote () { + [[ -z $compstate[quoting] ]] && + compstate[to_end]='' && + compadd -U -S "$SUFFIX" -I "$ISUFFIX"\" -i \""$IPREFIX" "${(Q)PREFIX}" +} +zstyle ':completion:quote-and-complete-word:*' completer _force_quote + +# Handle zsh autoloading conventions + +[[ -o kshautoload ]] || quote-and-complete-word "$@" |