about summary refs log tree commit diff
path: root/Completion/Unix/Command/_grep
blob: 0f1e712fd83617ebe5f35edc8c7f265dde94a0e3 (plain) (blame)
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 grep egrep fgrep bsdgrep rgrep zgrep zegrep zfgrep ggrep gegrep gfgrep gzgrep gzegrep gzfgrep bzgrep bzegrep bzfgrep -value-,GREP_OPTIONS,-default-

local command variant
local -a arguments matchers

if [[ $service = *GREP_OPT* ]]; then
  compset -q
  words=( fake "$words[@]" )
  (( CURRENT++ ))
  command=grep
else
  arguments=( '(-e --regexp -f --file)1: :_guard "^-*" pattern' )
  if [[ $service = z* ]]; then
    arguments+=( '*: :_files -g "*.gz(-.)"' )
  elif [[ $service = bz* ]]; then
    arguments+=( '*: :_files -g "*.bz2(-.)"' )
  else
    arguments+=( '*: :_files' )
  fi
  command="$words[1]"
fi

if [[ $service != (|g|z|gz|bz)[ef]grep ]]; then
  matchers='(--extended-regexp --fixed-strings --basic-regexp --perl-regexp -E -F -G -P)'
  arguments+=(
    $matchers{--extended-regexp,-E}'[use extended regular expression]'
    $matchers{--fixed-strings,-F}'[use literal strings]'
    $matchers{--basic-regexp,-G}'[use basic regular expression]'
  )
fi
[[ $service = rgrep ]] || arguments+=(
  '(--directories -d -r --recursive)'{--directories=,-d+}'[specify handling of directories]:action on directory:(read skip recurse)'
  '(--recursive -r --dereference-recursive -R -d --directories)'{--recursive,-r}'[recurse subdirectories]'
)

arguments+=(
  '(--after-context -A)'{--after-context=,-A+}'[specify lines of trailing context]:lines'
  '(--text -a --binary-files -I)'{--text,-a}'[process binary file as if it were text]'
  '(--before-context -B)'{--before-context=,-B+}'[specify lines of leading context]:lines'
  '(--context -C)'{--context=,-C-}'[specify lines of context]:lines'
  '(--color --colour)--'{color,colour}'=-[distinguish matching string]::when:(always never auto)'
  '(--byte-offset -b -c)'{--byte-offset,-b}'[print the byte offset with output lines]'
  '(--text -a -I)--binary-files=[specify type to assume for binary files]:file type:(binary without-match text)'
  '(--count -c --byte-offset -b --line-number -n)'{--count,-c}'[only print a count of matching lines]'
  '(--devices -D)'{--devices=,-D+}'[specify handling of devices, FIFOs and sockets]:action on device:(read skip)'
  '(1)*'{--regexp=,-e+}'[specify pattern]:pattern'
  '(1)*'{--file=,-f+}'[specify pattern file]:file:_files'
  '(--with-filename -H --no-filename -h)'{--with-filename,-H}'[print filename with each match]'
  '(--no-filename -h --with-filename -H --null -Z --files-without-match -L --file-with-matches -l)'{--no-filename,-h}'[suppress printing of filenames]'
  '--label=[provide filename to print for stdin]:filename label for stdin'
  '--line-buffered[flush output on every line]'
  '(--text -a --binary-files)-I[process binary files as if non-matching]'
  '(--ignore-case -i -y)'{--ignore-case,-i,-y}'[case-insensitive]'
  '(--files-without-match -L --file-with-matches -l --no-filename -h -o --only-matching)'{--files-without-match,-L}"[output non-matching files' names only]"
  '(--files-with-matches -l --files-without-match -L --no-filename -h -o --only-matching)'{--files-with-matches,-l}"[output matching files' names only]"
  '(--max-count -m)'{--max-count=,-m+}'[stop after specified no of matches in each file]:max number of matches'
  '(--line-number -n -c)'{--line-number,-n}'[prefix output with line numbers]'
  '(--only-matching -o --files-with-matches -l --files-without-match -L)'{--only-matching,-o}'[show only matching part of line]'
  '(--quiet --silent -q)'{--quiet,--silent,-q}'[suppress normal output]'
  '*--include=[examine files matching specified pattern]:file pattern'
  '*--exclude=[skip files matching specified pattern]:file pattern'
  '*--exclude-dir=[skip directories matching specified pattern]:directory pattern'
  '(--no-messages -s)'{--no-messages,-s}'[suppress messages about unreadable or non-existent files]'
  '(--version -V)'{--version,-V}'[display version info]'
  '(--invert-match -v)'{--invert-match,-v}'[select non-matching lines]'
  '(--word-regexp -w --line-regexp -x)'{--word-regexp,-w}'[force pattern to match only whole words]'
  '(--line-regexp -x --word-regexp -w)'{--line-regexp,-x}'[force pattern to match only whole lines]'
  '(-)--help[display help information]'
)

_pick_variant -r variant -c "$command" gnu=gnu gpl2=2.5.1 unix --version
case $variant:$OSTYPE in
  (gnu:*|gpl2:freebsd*))
    [[ $service != (|g|z|gz|bz)[ef]grep ]] && arguments+=(
      $matchers{--perl-regexp,-P}'[use perl regular expression]'
    )
  ;|
  *:openbsd*|unix:freebsd*)
    arguments=( # argument to context is optional and after = only
      ${arguments:#((#s)|*\))-(C|-context)*}
      '(--context -C)'{--context=-,-C-}'[specify lines of context]::lines'
    )
  ;|
  (gnu:*|gpl2:(free|net)bsd*))
    arguments+=(
      '*--exclude-from=[skip files matching pattern in specified file]:file:_files'
      '(-z --null-data)'{-z,--null-data}'[input data separated by 0 byte, not newline]'
    )
  ;|
  gpl2:(freebsd|darwin)*)
    arguments+=(
      '(--no-filename -h)--null[print 0 byte after each filename]'
      '(-Z --decompress -J --bz2decompress)'{-J,--bz2decompress}"[decompress bzip2'ed input before searching]"
      '(-Z --decompress -J --bz2decompress)'{-Z,--decompress}"[decompress gzip'ed input before searching]"
    )
  ;|
  (gpl2:darwin*|unix:freebsd*))
    arguments+=(
      '(-p -S)-O[recurse symlinks on the command line]'
      "!(-O -S)-p[don't recurse symlinks]"
      '(-O -p)-S[recurse all symlinks]'
      '*--include-dir=[only search directories matching specified pattern]:directory pattern'
    )
  ;|
  (gnu:*|gpl2:netbsd*|unix:freebsd*))
    arguments+=(
      '(--null -Z --no-filename -h)'{--null,-Z}'[print 0 byte after each filename]'
    )
  ;|
  gnu:*)
    arguments+=(
      '(--no-group-separator)--group-separator=[specify separator between blocks of context]:separator [--]'
      "(--group-separator)--no-group-separator[don't separate context blocks]"
      '(-T --initial-tab)'{-T,--initial-tab}'[make tabs line up (if needed)]'
      '(--recursive -r --dereference-recursive -R -d --directories)'{--dereference-recursive,-R}'[recurse subdirectories, following symlinks]'
    )
  ;;
  unix:freebsd*)
    arguments+=(
      '!(-U --binary --binary-files)'{-U,--binary}
      '--mmap[use mmap(2) instead of read(2) to read input]'
    )
    [[ $service = rgrep ]] || arguments+=(
      '(--recursive -r -d --directories)-R[recurse subdirectories]'
    )
  ;;
  gpl2:*) arguments=( ${${arguments:#*\)-r}/\)-r/\)-R} ) ;;
  *:openbsd*)
    arguments=(
      ${(M)arguments:#((#s)|*\))--(context|binary-files|line-buffered|label|max-count)*}
      ${${arguments:#((#s)|*\))(\*|)-[d-]*}/\)-r/\)-R}
      '(-h)--null[print 0 byte after each filename]'
      "-U[search binary files but don't print them]"
      '-Z[behave as zgrep]'
    )
  ;;
  *)
    # remove long options and GNU specific short opts, this is right for solaris
    arguments=( ${arguments:#((#s)|*\))(\*|)-[aABCdDfGHILmorVy-]*} )
  ;;
esac

_arguments -S -s $arguments[@]