diff options
Diffstat (limited to 'Functions')
-rw-r--r-- | Functions/Zle/.distfiles | 1 | ||||
-rw-r--r-- | Functions/Zle/keeper | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/Functions/Zle/.distfiles b/Functions/Zle/.distfiles index b00da2f41..bb590bb2e 100644 --- a/Functions/Zle/.distfiles +++ b/Functions/Zle/.distfiles @@ -14,4 +14,5 @@ match-words-by-style select-word-style transpose-words-match up-case-word-match delete-whole-word-match quote-and-complete-word url-quote-magic zed-set-file-name history-pattern-search +keeper ' diff --git a/Functions/Zle/keeper b/Functions/Zle/keeper new file mode 100644 index 000000000..2a721113d --- /dev/null +++ b/Functions/Zle/keeper @@ -0,0 +1,85 @@ +## +# The "keeper" function suite originally appeared in several zsh-users +# posts in the fall of 2004. It was published in summary form in the +# Shell Corner column on UnixReview.com in January 2005 at the URL +# <http://www.unixreview.com/documents/s=9513/ur0501a/ur0501a.htm> +# +# A few minor edits have been made to those functions for this file. Key +# bindings are commented out to avoid clashes with any existing bindings. +## + +declare -a kept + +# The "keep" function accepts a set of file patterns as the positional +# parameters or a series of lines (expected to represent file names) on +# standard input. It stores the expansion of those patterns, or the input +# lines, in the global variable $kept, and then displays the result +# formatted in columns, similar to an "ls" listing. Its alias, also named +# "keep", prevents the file patterns from being expanded when the command +# line is executed; they're expanded in the assignment to $kept instead, +# so that the local settings of nonomatch etc. are applied. + +function keep { + setopt localoptions nomarkdirs nonomatch nocshnullglob nullglob + setopt noksharrays noshwordsplit + kept=($~*) + if [[ ! -t 0 ]]; then + local line + while read -r line; do + kept+=( $line ) + done + fi + print -Rc - ${^kept%/}(T) +} +alias keep='noglob keep' + +# The function "_insert_kept" copies the value of $kept to the cursor +# position. If a prefix of a name is immediately to the left of the +# cursor, then only the subset of $kept that matches that prefix is +# copied, as is usual for completion. The examples bind it to two +# different widgets, "insert-kept-result" and "expand-kept-result". If +# invoked via the "expand-kept-result" widget, it replaces a pattern on +# the command line with the matching words from the $kept array. + +_insert_kept() { + (( $#kept )) || return 1 + local action + zstyle -s :completion:$curcontext insert-kept action + if [[ -n $action ]] + then compstate[insert]=$action + elif [[ $WIDGET = *expand* ]] + then compstate[insert]=all + fi + if [[ $WIDGET = *expand* ]] + then compadd -U ${(M)kept:#${~words[CURRENT]}} + else compadd -a kept + fi +} + +zle -C insert-kept-result complete-word _generic +zstyle ':completion:insert-kept-result:*' completer _insert_kept +# bindkey '^Xk' insert-kept-result + +zle -C expand-kept-result complete-word _generic +zstyle ':completion:expand-kept-result:*' completer _insert_kept +# bindkey '^XK' expand-kept-result + +# The "_expand_word_and_keep" function stores the expansions computed by +# the "_expand" completer in the global $kept for later retrieval by +# "_insert_kept". + +_expand_word_and_keep() { + function compadd() { + local -A args + zparseopts -E -A args J: + if [[ $args[-J] == all-expansions ]] + then + builtin compadd -A kept "$@" + kept=( ${(Q)${(z)kept}} ) + fi + builtin compadd "$@" + } + { _main_complete _expand } always { unfunction compadd } +} + +zle -C _expand_word complete-word _expand_word_and_keep |