Prefix one more function listed together with aliases with 'function'
[abe:zshrc.git] / zsh.d / 25-keephack
1 # -*- sh -*-
2 # Filename:      /etc/zsh/keephack
3 # Purpose:       this file belongs to the zsh setup (see /etc/zsh/zshrc)
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 # Latest change: Don Dez 06 23:21:30 CET 2007 [mika]
8 ################################################################################
9
10 # save output in a variable for later use
11 # Written by Bart Schaefer, for more details see:
12 # http://www.zsh.org/cgi-bin/mla/wilma_hiliter/users/2004/msg00894.html ff.
13 function keep {
14     setopt localoptions nomarkdirs nonomatch nocshnullglob nullglob
15     kept=()         # Erase old value in case of error on next line
16     kept=($~*)
17
18     if [[ ! -t 0 ]] ; then
19         local line
20         while read line; do
21             kept+=( $line )         # += is a zsh 4.2+ feature
22         done
23     fi
24
25     print -Rc - ${^kept%/}(T)
26 }
27 # use it via:
28 # locate -i backup | grep -i thursday | keep
29 # echo $kept
30 #
31 # or:
32 #
33 # patch < mypatch.diff
34 # keep **/*.(orig|rej)
35 # vim ${${kept:#*.orig}:r}
36 # rm $kept
37 alias keep='noglob keep'
38
39 _insert_kept() {
40     (( $#kept )) || return 1
41     local action
42     zstyle -s :completion:$curcontext insert-kept action
43
44     if [[ -n $action ]] ; then
45         compstate[insert]=$action
46     elif [[ $WIDGET == *expand* ]] ; then
47         compstate[insert]=all
48     fi
49     if [[ $WIDGET == *expand* ]] ; then
50         compadd -U ${(M)kept:#${~words[CURRENT]}}
51     else
52         compadd -a kept
53     fi
54 }
55
56 # now bind it to keys and enable completition
57 zle -C insert-kept-result complete-word _generic
58 zle -C expand-kept-result complete-word _generic
59 zstyle ':completion:*-kept-result:*' completer _insert_kept
60 zstyle ':completion:insert-kept-result:*' menu yes select
61
62 bindkey '^Xk' insert-kept-result
63 bindkey '^XK' expand-kept-result    # shift-K to get expansion
64
65 # And the "_expand_word_and_keep" replacement for _expand_word:
66 _expand_word_and_keep() {
67     function compadd() {
68         local -A args
69         zparseopts -E -A args J:
70         if [[ $args[-J] == all-expansions ]] ; then
71             builtin compadd -A kept "$@"
72             kept=( ${(Q)${(z)kept}} )
73         fi
74         builtin compadd "$@"
75     }
76     # for older versions of zsh:
77     local result
78     _main_complete _expand
79     result=$?
80     unfunction compadd
81     return result
82     # versions >=4.2.1 understand this:
83     # { _main_complete _expand } always { unfunction compadd }
84 }
85
86 # This line must come after "compinit" in startup:
87 zle -C _expand_word complete-word _expand_word_and_keep
88
89 # No bindkey needed, it's already ^Xe from _expand_word
90 zstyle ':completion:*' insert-kept menu
91 zmodload -i zsh/complist
92
93 ## END OF FILE #################################################################
94 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4