about summary refs log tree commit diff
path: root/Completion/Unix/Command/_ctags
blob: 30c631d3771b7364a6dbd00cf1991658a1cc11b4 (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#compdef ctags

local context state line expl
local -A opt_args

if [ -z "$_ctags_type" ]; then
  local output=`ctags --version 2>&1`
  if [[ "$output" = *Universal\ Ctags* ]]; then
    _ctags_type="universal"
  elif [[ "$output" = *Exuberant\ Ctags* ]]; then
    _ctags_type="exuberant"
  elif [[ "$output" = *usage:\ ctags* ]]; then
    _ctags_type="bsd"
  elif [[ "$output" = *Emacs* ]]; then
    _ctags_type="etags"
  else
    _ctags_type="universal"
  fi
fi

if [ "$_ctags_type" = "etags" ]; then
  _etags
  return $?
fi

local -a arguments

if [ "$_ctags_type" = "universal" ]; then
  arguments=(
    "-?[help text]"
    "-a[append to tags file]"
    "-B[use backward searching patterns (?...?)]"
    "-D[give definition for macro]:macro definition:"
    "-e[output tag file for use with emacs]"
    "-f[write tags to specified file. - is stdout]:file:_files"
    "-F[use forward searching patterns (/.../)]"
    "-G[equivalent to --guess-language-eagerly]"
    "-h[specify list of file extensions to be treated as include files]:"
    "-I[a list of tokens to be specifically handled is read from either the command line or the specified file]:"
    "-L[a list of input file names is read from the specified file. - is stdin]:file:_files"
    "-n[equivalent to --excmd=number]"
    "-N[equivalent to --excmd=pattern]"
    "-o[alternative to -f]:file:_files"
    "-R[equivalent to --recurse]"
    "-u[equivalent to --sort=no]"
    "-V[equivalent to --verbose]"
    "-x[print a tabular cross reference file to stdout]"
    "--alias-<lang>=[add a pattern detecting a name, can be used as an alt name for lang]:pattern"
    "--append=[should tags be appended to existing tag file]:bool:(yes no)"
    "--etags-include=[include reference to file in emacs style tag file]:file:_files"
    "--exclude=[exclude files and directories matching pattern]:pattern"
    "--exclude-exception=[don't exclude files and directories matching pattern even if they match the pattern specified with --exclude]:pattern"
    "--excmd=[uses the specified type of ex command to locate tags]:ex command type:(number pattern mix combine)"
    "--extras=[include extra tag entries for selected information (flags fFgpqrs)]:flags"
    "--extras-<lang>=[include <lang> own extra tag entries for selected information]:flags"
    "--fields=[include selected extension fields (flags aCeEfFikKlmnNpPrRsStxzZ)]:flags"
    "--fields-<lang>=[include selected <lang> own extension fields]:flags"
    "--filter=[behave as a filter, reading file names from stdin and writing tags to stdout]:bool:(yes no)"
    "--filter-terminator=[specify string to print to stdout following the tags for each file parsed when --filter is enabled]:string"
    "--format=[force output of specified tag file format]:level"
    "--guess-language-eagerly[guess the language of input file more eagerly]"
    "--help[help text]"
    "--help-full[help text with experimental features]"
    "--if0=[should code within #if 0 conditionals be parsed]:bool:(yes no)"
    "--input-encoding=[specify encoding of all input files]:encoding"
    "--input-encoding-<lang>=[specify encoding of the <lang> input files]:encoding"
    "--kinddef-<lang>=[define new kind for <lang>]:kind"
    "--kinds-<lang>=[enable/disable tag kinds for <lang>]:kind"
    "--langdef=[define a new language to be parsed with regular expressions]:name"
    "--langmap=[override default mapping of language to input file extension]:maps"
    "--language-force=[force all files to be interpreted using specified language]:language:->language"
    "--languages=[restrict files scanned to these comma-separated languages]:language:->languages"
    "--license[print details of software license]"
    "--line-directives=[should #line directives be processed]:bool:(yes no)"
    "--links=[indicate whether symlinks should be followed]:bool:(yes no)"
    "--list-aliases=[list of alias patterns]:language:->language"
    "--list-excludes[list of exclude patterns for files/dirs]"
    "--list-extras=[list of extra tag flags]:language:->language"
    "--list-features[list of compiled features]"
    "--list-fields=[list of fields]:language:->language"
    "--list-kinds=[list of all tag kinds for lang]:language:->language"
    "--list-kinds-full=[list details of all tag kinds for lang]:language:->language"
    "--list-languages[list of supported languages]"
    "--list-map-extensions=[list of language extensions in mapping]:language:->language"
    "--list-map-patterns=[list of language patterns in mapping]:language:->language"
    "--list-maps=[list of language mappings (both extensions and patterns)]:language:->language"
    "--list-mline-regex-flags[list of flags which can be used in a multiline regex parser definition]"
    "--list-params=[list of language parameters. works with --machinable]:language:->language"
    "--list-pseudo-tags[list of pseudo tags]"
    "--list-regex-flags[list of flags which can be used in a regex parser definition]"
    "--list-roles=[list of all roles of tag kinds specified for langs]:language:->language"
    "--list-subparsers=[list of subparsers for the base lang]:language:->language"
    "--machinable=[use tab separated representation in --list-* output]:bool:(yes no)"
    "--map-<lang>=[set, add(+), or remove(-) the map for <lang>]:pattern"
    "--maxdepth=[specify maximum recursion depth]:depth"
    "--mline-regex-<lang>=[define multiline regex for locating tags in <lang>]:pattern"
    "--options=[specify file (or dir) from which command line options should be read]:file:_files"
    "--options-maybe=[same as --options but doesn't error]:file:_files"
    "--optlib-dir=[add or set dir to optlib search path]:dir:_files -/"
    "--output-encoding=[the encoding to write the tag file in]:encoding"
    "--output-format=[specify the output format]:format:(u-ctags e-ctags etags xref)"
    "--param-<lang>=[set <lang> specific parameter]:argument"
    "--pattern-length-limit=[cutoff patterns of tag entries after N characters]:number"
    "--print-language[don't make tags file but just print the guessed lang name for input file]"
    "--pseudo-tags=[enable/disable emitting pseudo tag named ptag. if *, enable emitting all pseudo tags]:ptag"
    "--put-field-prefix[put UCTAGS as prefix for the name of fields newly introducted in universal ctags]"
    "--quiet=[don't print notice class messages]:bool:(yes no)"
    "--recurse=[recurse]:bool:(yes no)"
    "--regex-<lang>=[define regex for locating tags in specific lang]:pattern"
    "--roles-<lang>.<kind>=[enable/disable tag roles for kinds of <lang>]:role"
    "--sort=[should tags be sorted]:argument:(yes no foldcase)"
    "--tag-relative=[should paths be relative to location of tag file]:argument:(yes no always never)"
    "--totals=[print stats about input and tag files]:arguments:(yes no extra)"
    "--verbose=[enable verbose messages describing actions]:bool:(yes no)"
    "--version[print version]"
    "--with-list-header=[prepend the column descriptions in --list-* output]:bool:(yes no)"
    "*:file:_files"
  )
elif [ "$_ctags_type" = "exuberant" ]; then
  arguments=(
    "-a[append to tags file]"
    "-B[use backward searching patterns (?...?)]"
    "-e[output tag file for use with emacs]"
    "-f[write tags to specified file. - is stdout]:file:_files"
    "-F[use forward searching patterns (/.../)]"
    "-h[specify list of file extensions to be treated as include files]:"
    "-I[a list of tokens to be specifically handled is read from either the command line or the specified file]:"
    "-L[a list of input file names is read from the specified file. - is stdin]:file:_files"
    "-n[equivalent to --excmd=number]"
    "-N[equivalent to --excmd=pattern]"
    "-o[alternative to -f]:file:_files"
    "-R[equivalent to --recurse]"
    "-u[equivalent to --sort=no]"
    "-V[equivalent to --verbose]"
    "-x[print a tabular cross reference file to stdout]"
    "--append=[should tags be appended to existing tag file]:bool:(yes no)"
    "--etags-include=[include reference to file in emacs style tag file]:file:_files"
    "--exclude=[exclude files and directories matching pattern]:pattern"
    "--excmd=[uses the specified type of ex command to locate tags]:ex command type:(number pattern mix)"
    "--extra=[include extra tag entries for selected information (flags fq)]:flags"
    "--fields=[include selected extension fields (flags afmikKlnsStz)]:flags"
    "--file-scope=[should tags scoped only for a single file be included in output]:bool:(yes no)"
    "--filter=[behave as a filter, reading file names from stdin and writing tags to stdout]:bool:(yes no)"
    "--filter-terminator=[specify string to print to stdout following the tags for each file parsed when --filter is enabled]:string"
    "--format=[force output of specified tag file format]:level"
    "--help[help text]"
    "--if0=[should code within #if 0 conditionals be parsed]:bool:(yes no)"
    "--<lang>-kinds=[enable/disable tag kinds for <lang>]:kind"
    "--langdef=[define a new language to be parsed with regular expressions]:name"
    "--langmap=[override default mapping of language to input file extension]:maps"
    "--language-force=[force all files to be interpreted using specified language]:language:->language"
    "--languages=[restrict files scanned to these comma-separated languages]:language:->languages"
    "--license[print details of software license]"
    "--line-directives=[should #line directives be processed]:bool:(yes no)"
    "--links=[indicate whether symlinks should be followed]:bool:(yes no)"
    "--list-kinds=[list of all tag kinds for lang]:language:->language"
    "--list-languages[list of supported languages]"
    "--list-maps=[list of language mappings (both extensions and patterns)]:language:->language"
    "--options=[specify file (or dir) from which command line options should be read]:file:_files"
    "--recurse=[recurse]:bool:(yes no)"
    "--regex-<lang>=[define regex for locating tags in specific lang]:pattern"
    "--sort=[should tags be sorted]:argument:(yes no foldcase)"
    "--tag-relative=[should paths be relative to location of tag file]:argument:(yes no)"
    "--totals=[print stats about input and tag files]:arguments:(yes no)"
    "--verbose=[enable verbose messages describing actions]:bool:(yes no)"
    "--version[print version]”
    "*:file:_files"
  )
elif [ "$_ctags_type" = "bsd" ]; then
  arguments=(
    "-a[append to tags file]"
    "-B[use backward searching patterns (?...?)]"
    "-d[create tags for #defines that don't take arguments]"
    "-F[use forward searching patterns (/.../)]"
    "-f[write tags to specified file]:file:_files"
    "-t[create tags for typedefs, structs, unions, and enums]"
    "-u[update the specified files in the tags file]"
    "-v[an index of the form expected by vgrind(1) is produced]"
    "-w[suppress warning diagnostics]"
    "-x[ctags produces a simple function index]"
    "*:file:_files"
  )
fi

_arguments $arguments

if [[ "$state" = language* ]]; then
  local -a languages
  languages=(`ctags --list-languages | cut -d" " -f1`)
  if [ "$state" = "language" ]; then
    _wanted languages expl language compadd $languages
  elif [ "$state" = "languages" ]; then
    _values -s , languages $languages
  fi
fi

return $(( compstate[nmatches] > 0 ? 0 : 1 ))