diff options
author | Jacob Gelbman <gelbman@gmail.com> | 2021-03-11 11:08:05 -0600 |
---|---|---|
committer | Oliver Kiddle <opk@zsh.org> | 2021-03-29 00:50:42 +0200 |
commit | ab166725dd5983b00cf21113fb77717c6be324c5 (patch) | |
tree | 2605bc2b8042f8d4adfb40bcc8c79a1e27fa9cfa /Completion/Unix/Command | |
parent | e469b8c4e3187e19c96f118ce37579e92f12602f (diff) | |
download | zsh-ab166725dd5983b00cf21113fb77717c6be324c5.tar.gz zsh-ab166725dd5983b00cf21113fb77717c6be324c5.zip |
48166: add completion for ctags language options
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r-- | Completion/Unix/Command/_ctags | 441 |
1 files changed, 244 insertions, 197 deletions
diff --git a/Completion/Unix/Command/_ctags b/Completion/Unix/Command/_ctags index 30c631d37..3c80ba1c5 100644 --- a/Completion/Unix/Command/_ctags +++ b/Completion/Unix/Command/_ctags @@ -1,197 +1,244 @@ -#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 ))
+#compdef ctags arduino-ctags ctags-exuberant ctags-universal + +local context state line expl +local -A opt_args +local -a arguments + +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 + +_ctags_languages() { + _call_program languages $service --list-languages | sed -n 's/^\([A-Za-z][A-Za-z0-9#_+]*\).*/\1/p' +} + +if [[ "$PREFIX" = --alias-*=* ]]; then + _message pattern + return 1 +elif [[ "$PREFIX" = --extras-*=* ]]; then + _message flags + return 1 +elif [[ "$PREFIX" = --fields-*=* ]]; then + _message flags + return 1 +elif [[ "$PREFIX" = --input-encoding-*=* ]]; then + _message encoding + return 1 +elif [[ "$PREFIX" = --kinddef-*=* ]]; then + _message kind + return 1 +elif [[ "$PREFIX" = --kinds-*=* ]]; then + _message kind + return 1 +elif [[ "$PREFIX" = --map-*=* ]]; then + _message pattern + return 1 +elif [[ "$PREFIX" = --mline-regex-*=* ]]; then + _message pattern + return 1 +elif [[ "$PREFIX" = --param-*=* ]]; then + _message argument + return 1 +elif [[ "$PREFIX" = --regex-*=* ]]; then + _message pattern + return 1 +elif [[ "$PREFIX" = --roles-*.*=* ]] then + _message role + return 1 +elif [[ "$PREFIX" = --roles-*.* ]] then + _message kind + return 1 +fi + +if [ "$_ctags_type" = "universal" ]; then + arguments=( + "-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+,-o+}"[write tags to specified file]:output file:_files" + "-F[use forward searching patterns (/.../)]" + "-h[specify a list of file extensions to be treated as include files]:extensions" + "-I[specify a list of tokens to be specially handled]:identifier list" + "-L[read a list of input file names from the specified file]:input file:_files" + "-n[equivalent to --excmd=number]" + "-N[equivalent to --excmd=pattern]" + "(--recurse -R)--recurse=-[search files recursively]::bool:(yes no)" + "(--recurse -R)-R[search files recursively]" + "-u[equivalent to --sort=no]" + "-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]:language:->languageequals" + "--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)" + "--extras--[include <lang> own extra tag entries for selected information]:language:->languageequals" + "--fields=-[include selected extension fields]:flags (aCeEfFikKlmnNpPrRsStxzZ)" + "--fields--[include selected <lang> own extension fields]:language:->languageequals" + "--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 -G)"{--guess-language-eagerly,-G}"[guess the language of input file more eagerly]" + {--help,-?}"[display help text]" + "--help-full[display 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 <lang> input files]:language:->languageequals" + "--kinddef--[define new kind for <lang>]:language:->languageequals" + "--kinds--[enable/disable tag kinds for <lang>]:language:->languageequals" + "--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 <lang>]:language:->languageequals" + "--maxdepth=-[specify maximum recursion depth]:depth" + "--mline-regex--[define multiline regex for locating tags in <lang>]:language:->languageequals" + "--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 <lang> specific parameter]:language:->languageequals" + "--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)" + "--regex--[define regex for locating tags in specific lang]:language:->languageequals" + "--roles--[enable/disable tag roles for kinds of <lang>]:language:->languagedot" + "--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 -V)--verbose=-[enable verbose messages describing actions]:bool:(yes no)" + "(--verbose -V)-V[enable verbose messages describing actions]" + "--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+,-o+}"[write tags to specified file]:output file:_files" + "-F[use forward searching patterns (/.../)]" + "-h[specify a list of file extensions to be treated as include files]:extensions" + "-I[specify a list of tokens to be specially handled]:identifier list" + "-L[read a list of input file names from the specified file]:input file:_files" + "-n[equivalent to --excmd=number]" + "-N[equivalent to --excmd=pattern]" + "(--recurse -R)--recurse=-[search files recursively]::bool:(yes no)" + "(--recurse -R)-R[search files recursively]" + "-u[equivalent to --sort=no]" + "-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 (fg)" + "--fields=-[include selected extension fields]:flags (afmikKlnsStz)" + "--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[display help text]" + "--if0=-[should code within #if 0 conditionals be parsed]:bool:(yes no)" + "--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" + "--regex--[define regex for locating tags in specific lang]:language:->language" + "--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 -V)--verbose=-[enable verbose messages describing actions]:bool:(yes no)" + "(--verbose -V)-V[enable verbose messages describing actions]" + "--version[print version]" + "*:file:_files" + ) + if [[ "$PREFIX" = -* ]]; then + local -a languages=(`_ctags_languages`) + local -a languages2 + for language in $languages; do + arguments+=("--$language-kinds=-:kinds") + done + fi +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]:output 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 -s $arguments + +if [ "$state" = "language" ]; then + local -a languages=(`_ctags_languages`) + _wanted languages expl language compadd -a languages +elif [ "$state" = "languageequals" ]; then + local -a languages=(`_ctags_languages`) + _wanted languages expl language compadd -S = -a languages +elif [ "$state" = "languagedot" ]; then + local -a languages=(`_ctags_languages`) + _wanted languages expl language compadd -S . -a languages +elif [ "$state" = "languages" ]; then + local -a languages=(`_ctags_languages`) + _values -s , languages $languages +fi + +return $(( compstate[nmatches] > 0 ? 0 : 1 )) |