#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-=[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-=[include own extra tag entries for selected information]:flags" "--fields=[include selected extension fields (flags aCeEfFikKlmnNpPrRsStxzZ)]:flags" "--fields-=[include selected 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-=[specify encoding of the input files]:encoding" "--kinddef-=[define new kind for ]:kind" "--kinds-=[enable/disable tag kinds for ]: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-=[set, add(+), or remove(-) the map for ]:pattern" "--maxdepth=[specify maximum recursion depth]:depth" "--mline-regex-=[define multiline regex for locating tags in ]: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-=[set 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-=[define regex for locating tags in specific lang]:pattern" "--roles-.=[enable/disable tag roles for kinds of ]: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)" "---kinds=[enable/disable tag kinds for ]: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-=[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 ))