1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#compdef ack ack2 ack-grep ack-standalone
local curcontext="$curcontext" update_policy ign suf ret=1
local -a state line
local -A opt_args
_ack_types_caching_policy() {
# Rebuild if ackrc more recent than cache.
[[ -f ${ACKRC:-$HOME/.ackrc} && ${ACKRC:-$HOME/.ackrc} -nt "$1" ]] && return 0
# Rebuild if cache is older than one week.
local -a oldp
oldp=( "$1"(Nmw+1) )
(( $#oldp )) && return 0
return 1
}
zstyle -s ":completion:${curcontext}:" cache-policy update_policy
[[ -z "$update_policy" ]] && zstyle ":completion:${curcontext}:" cache-policy _ack_types_caching_policy
typeset -ga _ack_raw_types
if _cache_invalid ack-types || ! _retrieve_cache ack-types; then
_ack_raw_types=(
${(S)${(S)${(f)${${"$(_call_program file-types $words[1] --help-types)"}#*--\[no\]}}%; ?irst line matches \/*\/}#*no\]} )
[[ $#_ack_raw_types -gt 0 ]] && _store_cache ack-types _ack_raw_types
fi
(( $#words > 2 )) && ign='!'
_arguments -C -s -S \
'(-i --ignore-case -I -S --smart-case --no-smart-case --nosmart-case --lines)'{-i,--ignore-case}'[match case-insensitively]' \
'(-i --ignore-case -I -S --no-smart-case --nosmart-case --lines)'{-S,--smart-case}'[case-insensitive match unless pattern includes uppercase]' \
'(-i --ignore-case -I -S --smart-case --no-smart-case --nosmart-case --lines)'{--no-smart-case,--nosmart-case}'[disable --smart-case option]' \
'(-i --ignore-case -S --smart-case --no-smart-case --nosmart-case --lines)-I[turn on case-sensitivity in pattern]' \
'(-v --invert-match)'{-v,--invert-match}'[select non-matching lines]' \
'(-w --word-regexp)'{-w,--word-regexp}'[force pattern to match only whole words]' \
'(-Q --literal)'{-Q,--literal}'[use literal strings]' \
'(1)*--lines=[only print specific lines of each file]:line number (list and/or range)' \
'(-l --files-with-matches -L --files-without-matches)'{-l,--files-with-matches}"[output matching files' names only]" \
'(-L --files-without-matches -l --files-with-matches)'{-L,--files-without-matches}"[output non-matching files' names only]" \
'--output=[output result of expression for each line (turns off text highlighting)]:perl expression' \
'-o[show only matching part of line]' \
'--passthru[print all lines, whether matching or not]' \
'(1)--match=[specify the pattern explicitly]:pattern' \
'(-m --max-count)'{-m+,--max-count=}'[stop after specified no of matches in each file]:max number of matches' \
'-1[stop after reporting first match of any kind]' \
'(-H --with-filename -h --no-filename)'{-H,--with-filename}'[print filename with each match]' \
'(-h --no-filename -H --with-filename)'{-h,--no-filename}'[suppress printing of filenames]' \
'(-c --count)'{-c,--count}'[only print a count of matching lines]' \
'--column[print column number of first match on each line]' \
'(-A --after-context -C --context)'{-A+,--after-context=}'[specify lines of trailing context]::lines [2]' \
'(-B --before-context -C --context)'{-B+,--before-context=}'[specify lines of leading context]::lines [2]' \
'(-C --context -A --after-context -B --before-context)'{-C+,--context=}'[specify lines of context]:lines [2]' \
'--print0[separate filenames with a null instead of a newline]' \
'-s[suppress error messages about nonexistent or unreadable files]' \
"(--nopager)--pager=[direct ack's output through program]: : _command_names -e" \
"(--pager)--nopager[don't send output through a pager; overrides .ackrc, ACK_PAGER & ACK_PAGER_COLOR]" \
'(--noheading --heading)'{--noheading,--heading}'[print a filename heading above results, default on]' \
'(--nobreak --break)'{--nobreak,--break}'[print a break between results from different files, default on]' \
'(--nogroup)--group[group matches by file name]' \
"(--group)--nogroup[don't group matches by file name]" \
'--proximate=[separate match output with blank lines unless they are adjacent]::proximity (lines)' \
'(--nocolor --nocolour)--colo'{,u}'r[enable color highlighting of output]' \
'(--color --colour --color-filename --color-match --color-colno --color-lineno)--nocolo'{,u}'r[suppress the color]' \
'(--nocolor --nocolour --color --colour)--color-filename=[sets the color to be used for filenames]:color:->colors' \
'(--nocolor --nocolour --color --colour)--color-match=[sets the color to be used for matches]:color:->colors' \
'(--nocolor --nocolour --color --colour)--color-colno=[specify color for column numbers]:color:->colors' \
'(--nocolor --nocolour --color --colour)--color-lineno=[specify color for line numbers]:color:->colors' \
'--flush[flush output on every line]' \
'(1)-f[only print the files that would be searched, without actually doing any searching]' \
'(1)-g[print files where the relative path + filename matches the given pattern]:pattern to match against filenames' \
'--sort-files[sorts the found files lexically]' \
'--show-types[print the file types that ack associates with each file]' \
'(--files-from -x)--files-from=[read the list of files to search from specified file]:file:_files' \
'(-x --files-from)-x[read the list of files to search from standard input]' \
'*--ignore-dir'{,ectory}'=[ignore directory]:directory:_directories' \
'*--noignore-dir'{,ectory}'=[remove directory from ignored list]:directory:_directories' \
'*--ignore-file=[add filter for ignoring files]:filter:->filters' \
'(-r -R --recurse -n --no-recurse)'{-r,-R,--recurse}'[recurse subdirectories]' \
'(-n --no-recurse -r -R --recurse)'{-n,--no-recurse}"[don't descend into subdirectories]" \
'(--nofollow)--follow[follow symlinks]' \
"(--follow)--nofollow[don't follow symlinks]" \
'(-k --known-types)'{-k,--known-types}'[include only files of types that ack recognizes]' \
'*--type=[specify the types of files to include or exclude from a search]:type:->file-types' \
'*--type-'{add,set}'=[files with the given extensions are recognized as being of the given type]:type-def:->type-defs' \
'*--type-del=[remove all filters associated with specified file type]: :->file-types' \
'(--env)--noenv[ignore environment variables and global ackrc files]' '!(--noenv)--env)' \
'--ackrc=[specify an ackrc file to use]:file:_files' \
'--ignore-ack-defaults[ignore default definitions included with ack]' \
"${ign}(- 1 *)--create-ackrc[output an ackrc based on customizations]" \
"${ign}(- 1 *)"{-\?,--help}'[display usage information]' \
"${ign}(- 1 *)--help-types[display all known types]" \
"${ign}(- 1 *)--dump[display information on which options are loaded and which RC files]" \
'(--filter --nofilter)--filter[treat standard input as pipe]' \
'(--filter --nofilter)--nofilter[treat standard input as tty]' \
"${ign}(- 1 *)--man[display the manual page]" \
"${ign}(- 1 *)--faq[display the frequently asked questions]" \
"${ign}(- 1 *)--cookbook[display a list of tips and tricks for using ack]" \
"${ign}(- 1 *)--version[display version and copyright information]" \
"${ign}(- 1 *)--bar[consult Admiral Ackbar]" \
"${ign}(- 1 *)--thpppt[bill the cat]" \
"${ign}(- 1 *)--cathy[chocolate chocolate chocolate]" \
{'--','--no'}${_ack_raw_types/ ##/\[}']' \
'1: :_guard "^-*" pattern' \
'*:file:_files' && ret=0
case $state in
colors)
compset -P '* '
compset -S ' *'
_wanted colors expl color compadd \
{,on_}{,bright_}{black,red,green,yellow,blue,magenta,cyan,white} \
clear reset dark bold under{line,score} blink reverse concealed && ret=0
;;
type-defs)
if ! compset -P 1 '*:'; then
_message -e type-name 'type name'
return
fi
;& # fall-through
filters)
if compset -P 1 'ext:'; then
_sequence _wanted extensions expl 'extension' compadd - *.*(N:e) && ret=0
elif compset -P 1 'is:'; then
_description files expl 'file name'
_files "$expl[@]" && ret=0
elif compset -P 1 '(firstline|)match:'; then
_message -e patterns 'pattern'
else
compset -S ':*' || suf=-S
_description filters expl filter
compadd "$expl[@]" ${suf:+-S:} ext is && ret=0
compadd "$expl[@]" ${suf:+-S:/} match firstlinematch && ret=0
fi
;;
file-types)
local types; types=( {,no}${^_ack_raw_types/ ##/:} )
_describe -t file-types 'file type' types && ret=0
;;
esac
return ret
|