summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Functions/Zle/.distfiles1
-rw-r--r--Functions/Zle/keeper85
3 files changed, 91 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ae9116e70..ebf1d0d4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-21 Bart Schaefer <schaefer@brasslantern.com>
+
+ * unposted (cf. zsh-users/8409): Functions/Zle/keeper: "keeper"
+ suite from unixreview.com article.
+
2005-01-21 Oliver Kiddle <opk@zsh.org>
* unposted: remove Completion/Unix/Command/_larch: larch has
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