Provided by: universal-ctags_0+git20181215-2_amd64 bug

NAME

       ctags-universal - Generate tag files for source code

SYNOPSIS

       ctags-universal [options] [source_file(s)]
       etags [options] [source_file(s)]

DESCRIPTION

       The  ctags-universal  and etags programs (hereinafter collectively referred to as ctags-universal, except
       where distinguished) generate an index (or "tag") file for a variety of language objects found in  source
       file(s).  This  tag  file  allows  these items to be quickly and easily located by a text editor or other
       utilities (client tools). A tag signifies a language object for which an index entry  is  available  (or,
       alternatively, the index entry created for that object).

       Alternatively,  ctags-universal  can generate a cross reference file which lists, in human readable form,
       information about the various language objects found in a set of source files.

       Tag index files are supported by numerous editors, which allow the user to locate the  object  associated
       with  a  name  appearing  in  a source file and jump to the file and line which defines the name. See the
       manual of your favorite editor about utilizing ctags-universal command and the tag  index  files  in  the
       editor.

       ctags-universal  is  capable  of generating different kinds of tags for each of many different languages.
       For a complete list of supported languages, the names by which they are recognized, and the kinds of tags
       which are generated for each, see the --list-languages and --list-kinds-full options.

       This man page describes Universal-ctags, an implementation of ctags  derived  from  Exuberant-ctags.  The
       major   incompatible   changes   between   Universal-ctags   and   Exuberant-ctags   are   enumerated  in
       ctags-incompatibilities(7).

       One of the advantages of Exuberant-ctags is that it allows a user to define a new parser from the command
       line. Extending this capability  is  one  of  the  major  features  of  Universal-ctags.  ctags-optlib(7)
       describes how the capability is extended.

       Newly introduced experimental features are not explained here. If you are interested in such features and
       ctags-universal internals, visit http://docs.ctags.io/en/latest/.

SOURCE FILES

       Unless  the  --language-force  option  is  specified,  the  language of each source file is automatically
       selected based upon a mapping of file names to languages. The mappings in effect for each language may be
       displayed using the --list-maps option and may be changed using the --langmap or --map-<LANG> options.

       If the name of a file is not mapped to a language,  ctags-universal  tries  to  heuristically  guess  the
       language for the file by inspecting its content. See "Determining file language".

       All  files  that  have  no  file  name  mapping  and  no guessed parser are ignored. This permits running
       ctags-universal on all files in either a single directory (e.g.  "ctags-universal *"), or on all files in
       an entire source directory tree (e.g. "ctags-universal -R"), since  only  those  files  whose  names  are
       mapped to languages will be scanned.

       The  same  extensions  are  mapped  to  multiple  parsers.  For  example,  ".h"  are mapped to C++, C and
       ObjectiveC. These mappings can cause issues. ctags-universal tries to select the proper  parser  for  the
       source  file by applying heuristics to its content, however it is not perfect.  In case of issues one can
       use --language-force=language, --langmap=map[,map[...]], or the --map-<LANG>=-pattern|extension  options.
       (Some of the heuristics are applied whether --guess-language-eagerly is given or not.)

   Determining file language
       If  ctags-universal  cannot  select  a parser from the mapping of file names, various heuristic tests are
       conducted to determine the language:

       template file name testing
              If the file name has an ".in" extension, ctags-universal applies the  mapping  to  the  file  name
              without the extension. For example, "config.h" is tested for a file named "config.h.in".

       interpreter testing
              The  first  line  of  the  file  is  checked to see if the file is a "#!"  script for a recognized
              language.  ctags-universal looks for a parser having the same name.

              If ctags-universal finds no such parser, ctags-universal looks for the name in  alias  lists.  For
              example,  consider if the first line is "#!/bin/sh".  Though ctags-universal has a "shell" parser,
              it doesn't have a "sh" parser. However,  "sh"  is  listed  as  an  alias  for  "shell",  therefore
              ctags-universal selects the "shell" parser for the file.

              An  exception  is  "env".  If  "env"  is  specified, ctags-universal reads more lines to find real
              interpreter specification.

              To display the list of aliases, use --list-aliases option.  To  add/remove  an  item  to/from  the
              list, use the --alias-<LANG>=[+|-]aliasPattern option.

       zsh autoload tag testing
              If  the  first  line  starts  with  "#compdef" or "#autoload", ctags-universal regards the line as
              "zsh".

       emacs mode at the first line testing
              The Emacs editor has multiple editing modes  specialized  for  programming  languages.  Emacs  can
              recognize  a  marker called modeline in a file and utilize the marker for the mode selection. This
              heuristic test does the same as what Emacs does.

              ctags-universal treats MODE as a name of interpreter and applies the same  rule  of  "interpreter"
              testing if the first line has one of the following patterns:

                 -*- mode: MODE -*-

              or

                 -*- MODE -*-

       emacs mode at the EOF testing
              Emacs editor recognizes another marker at the end of file as a mode specifier. This heuristic test
              does the same as what Emacs does.

              ctags-universal treats MODE as a name of an interpreter and applies the same rule of "interpreter"
              heuristic testing, if the lines at the tail of the file have the following pattern:

                 Local Variables:
                 ...
                 mode: MODE
                 ...
                 End:

              3000 characters are sought from the end of file to find the pattern.

       vim modeline testing
              Like  the  modeline  of the Emacs editor, Vim editor has the same concept.  ctags-universal treats
              TYPE as a name of interpreter and applies the same rule of "interpreter" heuristic testing if  the
              last 5 lines of the file have one of the following patterns:

                 filetype=TYPE

              or

                 ft=TYPE

       PHP marker testing
              If the first line is started with "<?php", ctags-universal regards the line as "php".

       Looking  into the file contents is a more expensive operation than file name matching. So ctags-universal
       runs the testings in limited conditions.  "interpreter" testing  is  enabled  only  when  a  file  is  an
       executable  or  the --guess-language-eagerly (-G in short) option is given. The other heuristic tests are
       enabled only when -G option is given.

       The --print-language option can be used just to print the results of parser selections  for  given  files
       instead of generating a tags file.

       Examples:

          $ ctags-universal --print-language config.h.in input.m input.unknown
          config.h.in: C++
          input.m: MatLab
          input.unknown: NONE

       NONE means that ctags-universal does not select any parser for the file.

TAG ENTRIES

       A  tag  is  an index for a language object. The concept of a tag and related items in Exuberant-ctags are
       refined and extended in Universal-ctags.

       A tag is categorized into definition tags or reference  tags.   In  general,  Exuberant-ctags  only  tags
       definitions   of   language   objects:   places  where  newly  named  language  objects  are  introduced.
       Universal-ctags, on the other hand, can also tag references  of  language  objects:  places  where  named
       language  objects are used. However, support for generating reference tags is new and limited to specific
       areas of specific languages in the current version.

   Fields
       A tag can record various information, called fields. The essential fields are: name of language  objects,
       input,  pattern,  and  line.  input:  is  the  name  of source file where name: is defined or referenced.
       pattern: can be used to search the name in input:. line is the line number  where  name:  is  defined  or
       referenced in input:.

       ctags-universal  offers  extension fields. See also the descriptions of --list-fields option and --fields
       option.

   Kinds
       kind: is a field which represents the kind of language object specified by a tag. Kinds used and  defined
       are  very  different  between  parsers.  For example, C language defines "macro", "function", "variable",
       "typedef", etc. See also the descriptions of --list-kinds-full option and --kinds-<LANG> option.

   Extras
       Generally, ctags-universal tags only language objects appearing in source files, as is. In other words, a
       value for a name: field should be found on the source file associated with the name:. An "extra" type tag
       (extra) is for tagging a language object with a processed name, or for tagging something  not  associated
       with  a  language  object.  A  typical  extra  tag  is  "qualified",  which tags a language object with a
       class-qualified or scope-qualified name.

       The following example demonstrates the "qualified" extra tag.

          package Bar;
          import Baz;

          class Foo {
                  // ...
          }

       For the above source file, ctags-universal tags "Bar" and "Foo" by default.  If the "qualified" extra  is
       enabled  from  the  command  line  (--extras=+q),  then  "Bar.Foo"  is also tagged even though the string
       "Bar.Foo" is not in the source code.

       See also the descriptions of --list-extras option and --extras option in "OPTION ITEMS".

   Roles
       Role is a newly introduced concept in Universal-ctags. Role is a concept associated with reference  tags,
       and is not implemented widely yet.

       As  described  previously  in  "Kinds", the "kind" field represents the type of language object specified
       with a tag, such as a function vs. a variable.  Specific kinds are defined for reference  tags,  such  as
       the  C++ kind "header" for header file, or Java kind "package" for package statements. For such reference
       kinds, a "roles" field can be added to distinguish the role of the reference kind. In  other  words,  the
       "kind" field identifies the "what" of the language object, whereas the "roles" field identifies the "how"
       of a referenced language object. Roles are only used with specific kinds.

       For  example, for the source file used for demonstrating in the "Extras" subsection, "Baz" is tagged as a
       reference tag with kind "package" and with role "imported". Another example is for a  C++  "header"  kind
       tag,  generated  by "#include" statements: the roles:system or roles:local fields will be added depending
       on whether the include file name begins with "<" or not.

       See also the descriptions of --list-roles option.

   Language-specific fields and extras
       Exuberant-ctags has the concept of "fields" and "extras". They are common between  parsers  of  different
       languages. Universal-ctags extends this concept by providing language-specific fields and extras.

COMMAND LINE INTERFACE

       Despite  the  wealth  of  available  options,  defaults  are set so that ctags-universal is most commonly
       executed without any options (e.g.  "ctags-universal *", or "ctags-universal -R"), which  will  create  a
       tag  file  in  the  current  directory  for  all recognized source files. The options described below are
       provided merely to allow custom tailoring to meet special needs.

       Note that spaces separating the single-letter options from their parameters are optional.

       Note also that the boolean parameters to the long form options (those beginning with "--" and that take a
       "[=yes|no]" parameter) may be omitted, in which case "=yes" is implied. (e.g.  --sort  is  equivalent  to
       --sort=yes).   Note  further  that  "=1", "=on", and "=true" are considered synonyms for "=yes", and that
       "=0", "=off", and "=false" are considered synonyms for "=no".

       Some options are either ignored or useful only when used while running in etags  mode  (see  -e  option).
       Such options will be noted.

       Most options may appear anywhere on the command line, affecting only those files which follow the option.
       A few options, however, must appear before the first file name and will be noted as such.

       Options  taking  language  names  will  accept  those  names  in  either  upper  or  lower  case. See the
       --list-languages option for a complete list of the built-in language names.

   Letters and names
       Some options take letters as parameters (e.g. --kinds-<LANG> option).  Specifying  just  letters  help  a
       user  create  a  complicated command line quickly.  However, a command line including sequences of single
       letters becomes difficult to understand.

       Universal-ctags accepts names in addition to such letters. The names and  letters  can  be  mixed  in  an
       option  parameter by surrounding each name by braces. Thus, for an example, the following three notations
       for --kinds-C option have the same meaning:

          --kinds-C=+pLl
          --kinds-C=+{prototype}{label}{local}
          --kinds-C=+{prototype}L{local}

       Note that braces may be meta characters in your shell. Put single quotes in such case.

       --list-... options shows letters and associated names.

   List options
       Universal-ctags introduces many --list-... options that provide the  internal  data  of  Universal-ctags.
       Both  users  and  client  tools  may use the data. --with-list-header and --machinable options adjust the
       output of the most of --list-... options.

       The default setting (--with-list-header=yes and  --machinable=no)  is  for  using  interactively  from  a
       terminal.  The header that explains the meaning of columns is simply added to the output, and each column
       is aligned in all lines. The header line starts with a hash ('#') character.

       For scripting in a client tool, --with-list-header=no and --machinable=yes may be useful. The  header  is
       not added to the output, and each column is separated by tab characters.

       Note  the  order  of  columns  will change in the future release.  However, labels in the header will not
       change. So by scanning the header, a client tool can find the index for the target column.

OPTION ITEMS

       ctags-universal has more options than listed here.  Options starting with an underscore  character,  such
       as --_echo=msg, are not listed here. They are experimental or for debugging purpose.

       -a     Equivalent to --append.

       -B     Use backward searching patterns (e.g. ?pattern?). [Ignored in etags mode]

       -e     Same  as  --output-format=etags.  Enable etags mode, which will create a tag file for use with the
              Emacs editor. Alternatively, if ctags-universal is invoked by a name containing the string "etags"
              (either by renaming, or creating a link to, the executable), etags mode  will  be  enabled.   This
              option must appear before the first file name.

       -f tagfile
              Use  the  name specified by tagfile for the tag file (default is "tags", or "TAGS" when running in
              etags mode). If tagfile is specified as "-", then the tags are written to standard output instead.
              ctags-universal will stubbornly refuse to take  orders  if  tagfile  exists  and  its  first  line
              contains  something  other than a valid tags line. This will save your neck if you mistakenly type
              "ctags-universal -f *.c", which would  otherwise  overwrite  your  first  C  file  with  the  tags
              generated by the rest! It will also refuse to accept a multi-character file name which begins with
              a  '-' (dash) character, since this most likely means that you left out the tag file name and this
              option tried to grab the next option as the file name. If you really want to name your output  tag
              file "-ugly", specify it as "./-ugly". This option must appear before the first file name. If this
              option is specified more than once, only the last will apply.

       -F     Use forward searching patterns (e.g. /pattern/) (default). [Ignored in etags mode]

       -G     Equivalent to --guess-language-eagerly.

       -h list
              Specifies  a list of file extensions, separated by periods, which are to be interpreted as include
              (or header) files. To indicate files  having  no  extension,  use  a  period  not  followed  by  a
              non-period  character  (e.g.  ".",  "..x",  ".x.").  This  option  only affects how the scoping of
              particular kinds of tags are interpreted (i.e. whether or not  they  are  considered  as  globally
              visible  or visible only within the file in which they are defined); it does not map the extension
              to any particular language. Any tag which is located in a non-include  file  and  cannot  be  seen
              (e.g. linked to) from another file is considered to have file-limited (e.g. static) scope. No kind
              of  tag  appearing  in an include file will be considered to have file-limited scope. If the first
              character in the list is a plus sign, then the extensions in the list  will  be  appended  to  the
              current  list;  otherwise,  the  list  will  replace the current list. See, also, the --file-scope
              option. The default list is ".h.H.hh.hpp.hxx.h++.inc.def". To restore the default list, specify -h
              default. Note that if an extension supplied to this option is not already mapped to  a  particular
              language  (see  "SOURCE  FILES",  above),  you  will  also  need  to  use  either the --langmap or
              --language-force option.

       -I identifier-list
              Specifies a list of identifiers which are to be specially handled while parsing C and  C++  source
              files.  This  option  is  specifically provided to handle special cases arising through the use of
              preprocessor macros.  When the identifiers listed are simple identifiers, these  identifiers  will
              be  ignored during parsing of the source files. If an identifier is suffixed with a '+' character,
              ctags-universal will also ignore any parenthesis-enclosed  argument  list  which  may  immediately
              follow  the  identifier  in  the  source  files.  If  two  identifiers  are separated with the '='
              character, the first identifiers is replaced by the second identifiers for parsing  purposes.  The
              list  of identifiers may be supplied directly on the command line or read in from a separate file.
              If the first character of identifier-list is '@', '.' or a pathname separator ('/' or ''), or  the
              first  two  characters  specify  a drive letter (e.g. "C:"), the parameter identifier-list will be
              interpreted as a filename from  which  to  read  a  list  of  identifiers,  one  per  input  line.
              Otherwise, identifier-list is a list of identifiers (or identifier pairs) to be specially handled,
              each  delimited  by  either  a comma or by white space (in which case the list should be quoted to
              keep the entire list as one command line argument). Multiple -I options may be supplied. To  clear
              the list of ignore identifiers, supply a single dash ("-") for identifier-list.

              This  feature  is useful when preprocessor macros are used in such a way that they cause syntactic
              confusion due to their presence. Indeed, this is the best  way  of  working  around  a  number  of
              problems  caused  by  the presence of syntax-busting macros in source files (see "CAVEATS").  Some
              examples will illustrate this point.

                 int foo ARGDECL4(void *, ptr, long int, nbytes)

              In the above example, the macro "ARGDECL4" would be mistakenly interpreted to be the name  of  the
              function  instead  of  the  correct name of "foo". Specifying "-I ARGDECL4" results in the correct
              behavior.

                 /* creates an RCS version string in module */
                 MODULE_VERSION("$Revision$")

              In the above example the macro invocation looks too much like a function definition because it  is
              not  followed  by  a  semicolon (indeed, it could even be followed by a global variable definition
              that would look much like a K&R style function  parameter  declaration).  In  fact,  this  seeming
              function definition could possibly even cause the rest of the file to be skipped over while trying
              to complete the definition.  Specifying "-I MODULE_VERSION+" would avoid such a problem.

                 CLASS Example {
                         // your content here
                 };

              The  example  above  uses "CLASS" as a preprocessor macro which expands to something different for
              each platform. For instance CLASS  may  be  defined  as  "class  __declspec(dllexport)"  on  Win32
              platforms and simply "class" on UNIX. Normally, the absence of the C++ keyword "class" would cause
              the  source  file  to  be  incorrectly  parsed. Correct behavior can be restored by specifying "-I
              CLASS=class".

       -L file
              Read from file a list of file names for which tags should be generated.  If file is  specified  as
              "-", then file names are read from standard input. File names read using this option are processed
              following  file  names  appearing on the command line. Options are also accepted in this input. If
              this option is specified more than once,  only  the  last  will  apply.  Note:  file  is  read  in
              line-oriented  mode,  where  a  new  line  is  the  only delimiter and non-trailing white space is
              considered significant, in order that file names  containing  spaces  may  be  supplied  (however,
              trailing  white  space is stripped from lines); this can affect how options are parsed if included
              in the input.

       -n     Equivalent to --excmd=number.

       -N     Equivalent to --excmd=pattern.

       -o tagfile
              Equivalent to -f tagfile.

       -R     Equivalent to --recurse.

       -u     Equivalent to --sort=no (i.e. "unsorted").

       -V     Equivalent to --verbose.

       -w     This option is silently ignored for backward-compatibility with the ctags of SVR4 Unix.

       -x     Print a tabular, human-readable  cross  reference  (xref)  file  to  standard  output  instead  of
              generating a tag file. The information contained in the output includes: the tag name; the kind of
              tag;  the  line  number, file name, and source line (with extra white space condensed) of the file
              which defines the tag. No tag file is written and all options affecting tag file  output  will  be
              ignored.  Example  applications for this feature are generating a listing of all functions located
              in a source file (e.g. "ctags-universal -x  --c-kinds=f  file"),  or  generating  a  list  of  all
              externally visible global variables located in a source file (e.g. "ctags-universal -x --c-kinds=v
              --file-scope=no file").  This option must appear before the first file name.

       --alias-<LANG>=[+|-]aliasPattern
              Adds  ('+') or removes ('-') an alias pattern to a language specified with <LANG>. ctags-universal
              refers to the alias pattern in "Determining file language" stage.

              The parameter aliasPattern is not a list. Use this option multiple times in a command line to  add
              or remove multiple alias patterns.

              To  restore  the  default language aliases, specify "default" as the parameter aliasPattern. Using
              "all" for <LANG> has meaning in following two cases:

              --alias-all=
                     This clears aliases setting of all languages.

              --alias-all=default
                     This restores the default languages aliases for all languages.

       --append[=yes|no]
              Indicates whether tags generated from the specified files should  be  appended  to  those  already
              present  in the tag file or should replace them.  This option is "no" by default. This option must
              appear before the first file name.

       --etags-include=file
              Include a reference to file in the tag file. This  option  may  be  specified  as  many  times  as
              desired.  This  supports  Emacs'  capability  to  use a tag file which "includes" other tag files.
              [Available only in etags mode]

       --exclude=[pattern]
              Add pattern to a list of excluded files and directories. This option  may  be  specified  as  many
              times  as  desired. For each file name considered by ctags-universal, each pattern specified using
              this option will be compared against both the complete path  (e.g.   some/path/base.ext)  and  the
              base  name  (e.g.  base.ext)  of  the  file,  thus allowing patterns which match a given file name
              irrespective of its path, or match only a specific path. If appropriate support is available  from
              the  runtime  library  of your C compiler, then pattern may contain the usual shell wildcards (not
              regular expressions) common on Unix (be  sure  to  quote  the  option  parameter  to  protect  the
              wildcards  from  being expanded by the shell before being passed to ctags-universal; also be aware
              that wildcards can match the slash character, '/').  You can  determine  if  shell  wildcards  are
              available  on  your  platform  by  examining  the output of the --list-features option, which will
              include "wildcards" in the compiled feature list; otherwise, pattern is matched against file names
              using a simple textual comparison.

              If pattern begins with the character '@', then the rest of the string is  interpreted  as  a  file
              name  from  which  to  read  exclusion  patterns,  one  per line. If pattern is empty, the list of
              excluded patterns is cleared.

              Note that at program startup, the default exclude list contains names of common hidden and  system
              files,  patterns  for  binary  files,  and  directories for which it is generally not desirable to
              descend while processing the --recurse option. To see the list of built-in exclude  patterns,  use
              --list-excludes.

       --excmd=type
              Determines the type of EX command used to locate tags in the source file. [Ignored in etags mode]

              The valid values for type (either the entire word or the first letter is accepted) are:

              number Use only line numbers in the tag file for locating tags. This has four advantages:

                     1. Significantly reduces the size of the resulting tag file.

                     2. Eliminates  failures to find tags because the line defining the tag has changed, causing
                        the pattern match to fail (note that some editors, such as vim, are able to  recover  in
                        many such instances).

                     3. Eliminates finding identical matching, but incorrect, source lines (see "BUGS").

                     4. Retains  separate  entries  in the tag file for lines which are identical in content. In
                        pattern mode, duplicate entries are dropped because the search  patterns  they  generate
                        are identical, making the duplicate entries useless.

                     However,  this  option  has one significant drawback: changes to the source files can cause
                     the line numbers recorded in the tag file to no longer  correspond  to  the  lines  in  the
                     source file, causing jumps to some tags to miss the target definition by one or more lines.
                     Basically,  this  option  is  best  used when the source code to which it is applied is not
                     subject to change. Selecting this option type causes the following options to  be  ignored:
                     -BF.

              pattern
                     Use  only search patterns for all tags, rather than the line numbers usually used for macro
                     definitions. This has the advantage of not referencing obsolete  line  numbers  when  lines
                     have been added or removed since the tag file was generated.

              mixed  In  this  mode, patterns are generally used with a few exceptions.  For C, line numbers are
                     used for macro definition tags. This was the default format generated by the original ctags
                     and is, therefore, retained as the default for this option. For Fortran, line  numbers  are
                     used  for  common  blocks because their corresponding source lines are generally identical,
                     making pattern searches useless for finding all matches.

       --extra=[+|-]flags|*
              Equivalent to --extras=[+|-]flags|*, which was introduced to make  the  option  naming  convention
              align to the other options like --kinds-<LANG>= and --fields=.

              This option is kept for backward-compatibility with Exuberant-ctags.

       --extras=[+|-]flags|*
              Specifies whether to include extra tag entries for certain kinds of information. See also "Extras"
              subsection to know what are kinds.

              The parameter flags is a set of one-letter flags, each representing one kind of extra tag entry to
              include  in  the tag file.  If flags is preceded by either the '+' or '-' character, the effect of
              each flag is added to, or removed from, those currently enabled; otherwise the flags  replace  any
              current settings. All entries are included  if '*' is given.

              This  --extras=  option is for controlling extras common in all languages (or language-independent
              extras).  Universal-ctags also supports language-specific extras. (See  "Language-specific  fields
              and extras" about the concept). Use --extras-<LANG>= option for controlling them.

              The meaning of major extras is as follows (one-letter flag/name):

              F/fileScope
                     Equivalent to --file-scope.

              f/inputFile
                     Include  an  entry  for  the  base file name of every source file (e.g. "example.c"), which
                     addresses the first line of the file.  If the end: field is enabled, the end line number of
                     the file can be attached to the tag.

              p/pseudo
                     Include pseudo tags. Enabled by default unless the tag file is written to standard output.

              q/qualified
                     Include an extra class-qualified or namespace-qualified tag entry for each tag which  is  a
                     member of a class or a namespace.

                     This  may  allow easier location of a specific tags when multiple occurrences of a tag name
                     occur in the tag file.  Note, however, that this could potentially  more  than  double  the
                     size of the tag file.

                     The  actual  form  of  the  qualified  tag depends upon the language from which the tag was
                     derived (using a form that is most natural for how qualified calls  are  specified  in  the
                     language).  For C++ and Perl, it is in the form "class::member"; for Eiffel and Java, it is
                     in the form "class.member".

                     Note: Using backslash characters as separators forming qualified name in PHP.  However,  in
                     tags output of Universal-ctags, a backslash character in a name is escaped with a backslash
                     character.

              r/reference
                     Include reference tags. See "TAG ENTRIES" about reference tags.

              Inquire the output of --list-extras option for the other minor extras.

              A name associated with an extra can be used as alternative to a one-letter flag. Some minor extras
              have  no  one-letters  flag. In that case, names must be specified anyway. See "Letters and names"
              for more details.

       --extras-<LANG>=[+|-]flags|*
              Specifies whether to include extra tag entries for  certain  kinds  of  information  for  language
              <LANG>.  Universal-ctags  introduces  language-specific extras. (See "Language-specific fields and
              extras" about the concept). This option is for controlling them.

              Specifies "all" as <LANG> to apply the parameter flags to all languages; all  extras  are  enabled
              with  specifying  '*'  as  the  parameter  flags.  If  specifying  nothing  as the parameter flags
              ("--extras-all="), all extras are disabled. These two combinations are useful for testing.

              Check the output of the --list-extras=<LANG> option for the extras of specific language <LANG>.

       --fields-<LANG>=[+|-]flags|*
              Specifies which language-specific fields are to be included  in  the  entries  of  the  tag  file.
              Universal-ctags  supports  language-specific  fields.  (See  "Language-specific fields and extras"
              about the concept). This option is for controlling them.

              Specify "all" as <LANG> to apply the parameter flags to all fields; all fields  are  enabled  with
              specifying   '*'   as   the  parameter  flags.  If  specifying  nothing  as  the  parameter  flags
              ("--fields-all="), all extras are disabled. These two combinations are useful for testing.

       --fields=[+|-]flags|*
              Specifies which available extension fields are to be included in the tag entries  (see  "TAG  FILE
              FORMAT", below, and, "Fields", above, for more information).

              The parameter flags is a set of one-letter flags, each representing one type of extension field to
              include.   Each  letter or group of letters may be preceded by either '+' to add it to the default
              set, or '-' to exclude it. In the absence of any preceding '+' or  '-'  sign,  only  those  fields
              explicitly  listed  in flags will be included in the output (i.e. overriding the default set). All
              fields are included if '*' is given. This option is ignored if the option --format=1  (legacy  tag
              file format) has been specified.

              This  --fields=  option is for controlling fields common in all languages (or language-independent
              fields).  Universal-ctags also supports language-specific fields. (See  "Language-specific  fields
              and extras" about the concept). Use --fields-<LANG>= option for controlling them.

              The meaning of major fields is as follows (one-letter flag/name):

              a/access
                     Access (or export) of class members

              e/end  End lines of various items

              f/file File-restricted scoping. Enabled by default.

              i/inherits
                     Inheritance information.

              k      Kind of tag as a single letter. Enabled by default.  Exceptionally this has no name.

              K      Kind of tag as full name Exceptionally this has no name.

              l/language
                     Language of source file containing tag

              m/implementation
                     Implementation information

              n/line Line number of tag definition

              p/scopeKind
                     Kind of scope as full name

              r/roles
                     Roles assigned to the tag.  For a definition tag, this field takes "def" as a value.

              s      Scope of tag definition. Enabled by default.  Exceptionally this has no name.

              S/signature
                     Signature of routine (e.g. prototype or parameter list)

              t/typeref
                     Type and name of a variable, typedef or return type of callable like function as "typeref:"
                     field.  Enabled by default.

              z/kind Include the "kind:" key in kind field

              Z      Include the "scope:" key in scope field.  Exceptionally this has no name.

              Check the output of the --list-fields option for the other minor fields.

              A  name associated with a field can be used as alternative to a one-letter flag. Some minor fields
              have no one-letters flag. In that case, names must be specified anyway. See  "Letters  and  names"
              for more details.

       --file-scope[=yes|no]
              Indicates  whether  tags  scoped only for a single file (i.e. tags which cannot be seen outside of
              the file in which they are defined, such as "static" tags) should be included in the output.  See,
              also, the -h option. This option is enabled by default.

              Universal-ctags  provides an alternative way to control this option, with the "F/fileScope" extra,
              and  recommends  users  to  use  the  extra.  However,  this  extra   can   cause   issues.    See
              ctags-incompatibilities(7).

       --filter[=yes|no]
              Makes  ctags-universal  behave  as  a  filter,  reading  source file names from standard input and
              printing their tags to standard output on a file-by-file basis. If --sort  is  enabled,  tags  are
              sorted  only  within  the source file in which they are defined. File names are read from standard
              input in line-oriented input mode (see note for -L option) and only after file names listed on the
              command line or from any file supplied using the -L option.  When  this  option  is  enabled,  the
              options  -f,  -o,  and  --totals  are  ignored.  This  option is quite esoteric and is disabled by
              default. This option must appear before the first file name.

       --filter-terminator=string
              Specifies a string to print to standard output following the tags for each file name  parsed  when
              the   --filter  option  is  enabled.  This  may  permit  an  application  reading  the  output  of
              ctags-universal to determine when the output for each file is finished. Note that if the file name
              read is a directory and --recurse is enabled, this string will be printed only once at the end  of
              all tags found for by descending the directory. This string will always be separated from the last
              tag  line  for  the file by its terminating newline. This option is quite esoteric and is empty by
              default. This option must appear before the first file name.

       --format=level
              Change the format of the output tag file. Currently the only valid values for level are  1  or  2.
              Level  1  specifies  the  original  tag  file  format  and level 2 specifies a new extended format
              containing extension fields (but in a manner which retains  backward-compatibility  with  original
              vi(1)  implementations).  The  default  level  is 2. This option must appear before the first file
              name. [Ignored in etags mode]

       --guess-language-eagerly
              Looks into the  file  contents  for  heuristically  guessing  the  proper  language  parser.   See
              "Determining file language".

       --help Prints to standard output a detailed usage description, and then exits.

       --help-full
              Prints  to  standard  output  a  detailed  usage description about experimental features, and then
              exits. Visit http://docs.ctags.io/en/latest for information about the latest exciting experimental
              features.

       --if0[=yes|no]
              Indicates a preference as to whether code within an "#if 0" branch of a  preprocessor  conditional
              should be examined for non-macro tags (macro tags are always included). Because the intent of this
              construct  is  to disable code, the default value of this option is no. Note that this indicates a
              preference only and does not guarantee skipping code within an "#if 0" branch, since the fall-back
              algorithm used to generate tags  when  preprocessor  conditionals  are  too  complex  follows  all
              branches of a conditional. This option is disabled by default.

       --kinddef-<LANG>=letter,name,description
              See ctags-optlib(7).  Be not confused this with --kinds-<LANG>.

       --kinds-<LANG>=[+|-]kinds|*
              Specifies a list of language-specific kinds of tags (or kinds) to include in the output file for a
              particular  language,  where  <LANG> is case-insensitive and is one of the built-in language names
              (see the --list-languages option for  a  complete  list).  The  parameter  kinds  is  a  group  of
              one-letter  flags  designating  kinds  of  tags  (particular to the language) to either include or
              exclude from the output. The specific sets of flags recognized for each language,  their  meanings
              and  defaults  may be list using the --list-kinds-full option. Each letter or group of letters may
              be preceded by either '+' to add it to, or '-' to remove it from, the default set. In the  absence
              of  any preceding '+' or '-' sign, only those kinds explicitly listed in kinds will be included in
              the output (i.e. overriding the default for the specified language).

              Specify '*' as the parameter to include all kinds implemented in <LANG> in the output. Furthermore
              if "all" is given as <LANG>, specification of the parameter kinds affects all languages defined in
              ctags-universal. Giving "all" makes sense only when '*' is given as the parameter kinds.

              As an example for the C language, in order to add prototypes and external variable declarations to
              the default set of tag kinds, but exclude macros, use "--c-kinds=+px-d"; to include only tags  for
              functions, use "--c-kinds=f".

              A  name  associated  with a kind can be used as alternative to a one-letter flag. See "Letters and
              names" for more details.

       --<LANG>-kinds=[+|-]kinds|*
              Equivalent  to  --kinds-<LANG>=....  This  option  is   kept   for   backward-compatibility   with
              Exuberant-ctags.

       --langdef=name
              See ctags-optlib(7).

       --langmap=map[,map[...]]
              Controls how file names are mapped to languages (see the --list-maps option). Each comma-separated
              map  consists  of  the  language name (either a built-in or user-defined language), a colon, and a
              list of file extensions and/or file name patterns. A file extension is specified by preceding  the
              extension  with a period (e.g. ".c"). A file name pattern is specified by enclosing the pattern in
              parentheses (e.g.  "([Mm]akefile)").

              If appropriate support is available from the runtime library of your C  compiler,  then  the  file
              name  pattern  may  contain  the usual shell wildcards common on Unix (be sure to quote the option
              parameter to protect the wildcards from being  expanded  by  the  shell  before  being  passed  to
              ctags-universal). You can determine if shell wildcards are available on your platform by examining
              the  output  of the --list-features option, which will include "wildcards" in the compiled feature
              list; otherwise, the file name patterns are matched against file  names  using  a  simple  textual
              comparison.

              When  mapping  a  file  extension  with --langmap option, it will first be unmapped from any other
              languages. (--map-<LANG> option provides more fine-grained control.)

              If the first character in a map is a plus sign ('+'), then the extensions and file  name  patterns
              in that map will be appended to the current map for that language; otherwise, the map will replace
              the  current  map.  For example, to specify that only files with extensions of .c and .x are to be
              treated as C language files, use "--langmap=c:.c.x"; to also add files with extensions  of  .j  as
              Java  language  files,  specify  "--langmap=c:.c.x,java:+.j".  To  map makefiles (e.g. files named
              either "Makefile", "makefile", or having the  extension  ".mak")  to  a  language  called  "make",
              specify "--langmap=make:([Mm]akefile).mak". To map files having no extension, specify a period not
              followed by a non-period character (e.g. ".", "..x", ".x.").

              To  clear  the mapping for a particular language (thus inhibiting automatic generation of tags for
              that language), specify an empty extension  list  (e.g.  "--langmap=fortran:").   To  restore  the
              default language mappings for a particular language, supply the keyword "default" for the mapping.
              To specify restore the default language mappings for all languages, specify "--langmap=default".

              Note  that  file  name patterns are tested before file extensions when inferring the language of a
              file.   This   order   of    Universal-ctags    is    different    from    Exuberant-ctags.    See
              ctags-incompatibilities(7) for the background of this incompatible change.

       --language-force=language
              By  default,  ctags-universal  automatically selects the language of a source file, ignoring those
              files whose language cannot be determined (see "SOURCE FILES",  above).  This  option  forces  the
              specified  language  (case-insensitive;  either  built-in  or  user-defined)  to be used for every
              supplied file instead of automatically  selecting  the  language  based  upon  its  extension.  In
              addition,  the  special  value "auto" indicates that the language should be automatically selected
              (which effectively disables this option).

       --languages=[+|-]list
              Specifies  the  languages  for  which  tag  generation  is  enabled,  with   list   containing   a
              comma-separated list of language names (case-insensitive; either built-in or user-defined). If the
              first  language  of  list  is  not  preceded by either a '+' or '-', the current list (the current
              settings of enabled/disabled languages managed in  ctags-universal  internally)  will  be  cleared
              before  adding or removing the languages in list. Until a '-' is encountered, each language in the
              list will be added to the current list.  As either the '+' or '-' is encountered in the list,  the
              languages following it are added or removed from the current list, respectively.  Thus, it becomes
              simple  to replace the current list with a new one, or to add or remove languages from the current
              list.

              The actual list of files for which tags will be generated  depends  upon  the  language  extension
              mapping  in  effect  (see  the  --langmap  option). Note that the most of all languages, including
              user-defined languages, are enabled unless explicitly disabled using this option.  Language  names
              included  in  list  may  be  any  built-in  language or one previously defined with --langdef. The
              default is "all", which is also accepted as a valid argument. See the --list-languages option  for
              a list of the all (built-in and user-defined) language names.

              Note  --languages=  option  works  cumulative  way;  the  option  can  be specified with different
              arguments multiple times in a command line.

       --license
              Prints a summary of the software license to standard output, and then exits.

       --line-directives[=yes|no]
              Specifies whether "#line" directives should be recognized. These are  present  in  the  output  of
              preprocessors  and  contain  the  line  number, and possibly the file name, of the original source
              file(s) from which the preprocessor output file was generated.  When  enabled,  this  option  will
              cause ctags-universal to generate tag entries marked with the file names and line numbers of their
              locations  original  source file(s), instead of their actual locations in the preprocessor output.
              The actual file names placed into the tag file will have the same leading path components  as  the
              preprocessor  output file, since it is assumed that the original source files are located relative
              to the preprocessor output file (unless, of course, the  #line  directive  specifies  an  absolute
              path).  This  option  is  off  by  default.  Note:  This option is generally only useful when used
              together with the --excmd=number (-n) option.  Also, you may have to use either the  --langmap  or
              --language-force  option  if  the  extension  of  the  preprocessor  output  file  is not known to
              ctags-universal.

       --links[=yes|no]
              Indicates whether symbolic links (if supported) should be followed.  When disabled, symbolic links
              are ignored. This option is on by default.

       --list-aliases[=language|all]
              Lists the aliases for either the specified language or all languages, and then exits. The  aliases
              are used when heuristically testing a language parser for a source file.

       --list-excludes
              Lists the current exclusion patterns used to exclude files.

       --list-extras[=languages|all]
              Lists  the  extras  recognized  for either the specified language or "all" languages. See "Extras"
              subsection to know what are extras.

              An extra can be enabled or disabled  with  --extras=  for  common  extras  in  all  languages,  or
              --extras-<LANG>=  for  the  specified  language.   These option takes one-letter flag or name as a
              parameter for specifying an extra.

              The meaning of columns are as follows:

              LETTER One-letter flag. '-' means the extra does not have one-letter flag.

              NAME   The name of extra. The name is used in extras: field.

              ENABLED
                     Whether the extra is enabled or not. It takes "yes" or "no".

              LANGUAGE
                     The name of language if the extra is owned by a parser.  "NONE" means the extra  is  common
                     in parsers.

              DESCRIPTION
                     Human readable description for the extra.

       --list-features
              Lists the compiled features.

       --list-fields[=language|all]
              Lists  the  fields  recognized  for either the specified language or "all" languages. See "Fields"
              subsection to know what are fields.

              A field can be enabled or  disabled  with  --fields=  for  common  extras  in  all  languages,  or
              --fields-<LANG>=  for  the  specified  language.   These option takes one-letter flag or name as a
              parameter for specifying a field.

              The meaning of columns are as follows:

              LETTER One-letter flag. '-' means the field does not have one-letter flag.

              NAME   The name of field.

              ENABLED
                     Whether the field is enabled or not. It takes "yes" or "no".

              LANGUAGE
                     The name of language if the field is owned by a parser.  "NONE" means the extra  is  common
                     in parsers.

              JSTYPE Json type used in printing the value of field when "--output-format=json" is specified.

                     Following characters are used for representing types.

                     s      string

                     i      integer

                     b      boolean (true or false)

                     The  representation  of this field and the output format used in "--output-format=json" are
                     still experimental.

              FIXED  Whether this field can be disabled or not. Some fields are printed always in  tags  output.
                     They have "yes" as the value for this column.

              DESCRIPTION
                     Human readable description for the field.

       --list-kinds[=language|all]
              Subset of --list-kinds-full. This option is kept for backward-compatibility with Exuberant-ctags.

              This  option  prints  only  LETTER,  DESCRIPTION,  and ENABLED fields of --list-kinds-full output.
              However, the presentation of ENABLED column is different from that  of  --list-kinds-full  option;
              "[off]" follows after description if the kind is disabled, and nothing follows     if enabled. The
              most of all kinds are enabled by default.

              The  critical  weakness  of  this  option  is  that  this  option does not print the name of kind.
              Universal-ctags introduces --list-kinds-full because it considers that names are important.

              This option does not work with --machinable nor --with-list-header.

       --list-kinds-full[=language|all]
              Lists the tag kinds recognized for either the specified language  or  "all"  languages,  and  then
              exits. See "Kinds" subsection to learn what kinds are.

              Each  kind  of tag recorded in the tag file is represented by a one-letter flag, or name. They are
              also used to filter the tags placed into the output through use of the --kinds-<LANG> option.

              The meaning of columns are as follows:

              LANGUAGE
                     The name of language having the kind.

              LETTER One-letter flag. This must be unique in a language.

              NAME   Name of the kind. This can be used as the alternative one-letter flag described  above.  If
                     enabling  'K'  field  with --fields=+K, ctags-universal uses name instead of letter in tags
                     output. To enable/disable a kind with --kinds-<LANG>  option,  name  surrounded  by  braces
                     instead of letter. See "Letters and names" for details. This must be unique in a language.

              ENABLED
                     Whether the kind is enabled or not. It takes "yes" or "no".

              REFONLY
                     Whether  the kind is specialized for reference tagging or not.  If the column is "yes", the
                     kind is for reference tagging, and it is never used for definition tagging. See  also  "TAG
                     ENTRIES".

              NROLES The number of roles this kind has. See also "Roles".

              MASTER The master parser controlling enablement of the kind.  A kind belongs to a language (owner)
                     in  Universal-ctags; enabling and disabling a kind in a language has no effect on a kind in
                     another language even if both kinds has the same letter and/or  the  same  name.  In  other
                     words, the namespace of kinds are separated by language.

                     However, Exuberant-ctags does not separate the kinds of C and C++. Enabling/disabling kindX
                     in  C  language enables/disables a kind in C++ language having the same name with kindX. To
                     emulate this behavior in Universal-ctags, a concept named "master  parser"  is  introduced.
                     Enabling/disabling some kinds are synchronized under the control of a master language.

                        $ ctags --kinds-C=+'{local}' --list-kinds-full \
                          | grep -E '^(#|C\+\+ .* local)'
                        #LANGUAGE  LETTER NAME   ENABLED REFONLY NROLES MASTER DESCRIPTION
                        C++        l      local  yes     no      0      C      local variables
                        $ ctags --kinds-C=-'{local}' --list-kinds-full \
                          | grep -E '^(#|C\+\+ .* local)'
                        #LANGUAGE  LETTER NAME   ENABLED REFONLY NROLES MASTER DESCRIPTION
                        C++        l      local  no      no      0      C      local variables

                     You see "ENABLED" field of "local" kind of C++ language is changed Though "local" kind of C
                     language is enabled/disabled. If you swap the languages, you see the same result.

              DESCRIPTION
                     Human readable description for the kind.

       --list-languages
              Lists  the  names  of  the languages understood by ctags-universal, and then exits. These language
              names are case  insensitive  and  may  be  used  in  many  other  options  like  --language-force,
              --languages, --kinds-<LANG>, --regex-<LANG>, and so on.

              Each  language  listed  is  disabled  if  followed  by "[disabled]".  To use the parser for such a
              language, specify the language as an argument of --languages=+ option.

              This option does not work with --machinable nor --with-list-header.

       --list-map-extensions[=language|all]
              Lists the file extensions which associate a file name with a language  for  either  the  specified
              language or all languages, and then exits.

       --list-map-patterns[=language|all]
              Lists  the file name patterns which associate a file name with a language for either the specified
              language or all languages, and then exits.

       --list-maps[=language|all]
              Lists file name patterns and the file extensions which associate a file name with a  language  for
              either  the  specified  language  or  all languages, and then exits. See the --langmap option, and
              "SOURCE FILES", above.

              To list the file extensions or file  name  patterns  individually,  use  --list-map-extensions  or
              --list-map-patterns option.  See the --langmap option, and "SOURCE FILES", above.

              This option does not work with --machinable nor --with-list-header.

       --list-regex-flags
              See ctags-optlib(7).

       --list-roles[=language|all[.kinds]]
              List  the  roles  for  either the specified language or "all" languages. If the parameter kinds is
              given after the parameter language or "all" with concatenating with '.', list only  roles  defined
              in the kinds. Both one-letter flags and names surrounded by braces are acceptable as the parameter
              kinds.

              The meaning of columns are as follows:

              LANGUAGE
                     Name of language having the role.

              KIND(L/N)
                     One-letter flag and name of kind having the role.

              NAME   Name of the role.

              ENABLED
                     Whether  the  kind  is  enabled  or  not. It takes "yes" or "no".  (Currently all roles are
                     enabled. No option for disabling a specified role is not implemented yet.)

              DESCRIPTION
                     Human readable description for the role.

       --machinable[=yes|no]
              Use tab character as separators for --list- option output.  It may be suitable for scripting.  See
              "List options" for considered use cases. Disabled by default.

       --map-<LANG>=[+|-]extension|pattern
              This  option  provides  the  way  to  control  mapping(s)  of  file  names  to languages in a more
              fine-grained way than --langmap option.

              In ctags-universal, more than one language can map to a file name pattern or file  extension  (N:1
              map).  Alternatively,  --langmap option handle only 1:1 map, only one language mapping to one file
              name pattern or file extension.  A typical N:1 map is seen in C++ and  ObjectiveC  language;  both
              languages have a map to ".h" as a file extension.

              A  file  extension is specified by preceding the extension with a period (e.g. ".c").  A file name
              pattern is specified by enclosing the pattern in parentheses (e.g.  "([Mm]akefile)").  A  prefixed
              plus  ('+') sign is for adding, and minus ('-') is for removing. No prefix means replacing the map
              of <LANG>.

              Unlike --langmap, extension (or pattern) is not a list.   --map-<LANG>  takes  one  extension  (or
              pattern).  However,  the  option  can  be  specified  with different arguments multiple times in a
              command line.

       --maxdepth
              Limits the depth of directory recursion enabled with the --recurse (-R) option.

       --options=pathname
              Read additional options from file or directory.

              ctags-universal searches pathname in optlib path list first. If ctags-universal cannot find a file
              or directory in the list, ctags-universal reads a file or directory at the specified pathname.

              If a file is specified, it should contain one option per line. If a directory is specified,  files
              suffixed with ".ctags" under it are read in alphabetical order.

              As  a  special  case,  if  "--options=NONE"  is specified as the first option on the command line,
              preloading is disabled; the option will disable the automatic reading of any configuration options
              from either a file or the environment (see "FILES").

       --options-maybe=pathname
              Same as --options but doesn't cause an error  if  file  (or  directory)  specified  with  pathname
              doesn't exist.

       --optlib-dir=[+]directory
              Add an optlib directory to or reset optlib path list.  By default, the optlib path list is empty.

       --print-language
              Just prints the language parsers for specified source files, and then exits.

       --quiet[=yes|no]
              Write fewer messages (default is no).

       --recurse[=yes|no]
              Recurse into directories encountered in the list of supplied files.  If the list of supplied files
              is  empty  and no file list is specified with the -L option, then the current directory (i.e. ".")
              is assumed.  Symbolic links are followed. If you don't like  these  behaviors,  either  explicitly
              specify  the  files  or  pipe  the  output of find(1) into ctags-universal -L- instead. Note: This
              option is not supported on all platforms at present. It is available if the output of  the  --help
              option includes this option. See, also, the --exclude to limit recursion.

       --regex-<LANG>=/regexp/replacement/[kind-spec/][flags]
              See ctags-optlib(7).

       --sort[=yes|no|foldcase]
              Indicates  whether  the  tag file should be sorted on the tag name (default is yes). Note that the
              original  vi(1)  required  sorted  tags.   The  foldcase  value  specifies  case  insensitive  (or
              case-folded)  sorting.   Fast  binary  searches of tag files sorted with case-folding will require
              special support from tools using tag files, such as that found  in  the  ctags-universal  readtags
              library, or Vim version 6.2 or higher (using "set ignorecase"). This option must appear before the
              first file name. [Ignored in etags mode]

       --tag-relative[=yes|no]
              Indicates  that  the  file  paths  recorded  in  the  tag file should be relative to the directory
              containing the tag file, rather than relative to the current directory, unless the files  supplied
              on  the  command  line are specified with absolute paths. This option must appear before the first
              file name. The default is yes when running in etags mode (see the -e option), no otherwise.

       --totals[=yes|no]
              Prints statistics about the source files  read  and  the  tag  file  written  during  the  current
              invocation  of  ctags-universal. This option is off by default. This option must appear before the
              first file name.

       --verbose[=yes|no]
              Enable verbose mode. This prints  out  information  on  option  processing  and  a  brief  message
              describing  what  action  is  being  taken  for each file considered by ctags-universal. Normally,
              ctags-universal does not read command line  arguments  until  after  options  are  read  from  the
              configuration  files  (see  "FILES",  below)  and the CTAGS environment variable. However, if this
              option is the first argument on the command line, it will take effect before any options are  read
              from these sources. The default is no.

       --version
              Prints  a  version  identifier  for  ctags-universal  to  standard output, and then exits. This is
              guaranteed to always contain the string "Universal Ctags".

       --with-list-header[=yes|no]
              Print headers describing columns in --list- option output.  See also "List options".

OPERATIONAL DETAILS

       As ctags-universal considers each file name in turn, it tries to determine the language of  the  file  by
       applying  the following three tests in order: if the file extension has been mapped to a language, if the
       filename matches a shell pattern mapped to a language, and finally if the  file  is  executable  and  its
       first  line  specifies  an  interpreter  using  the  Unix-style  "#!"  specification (if supported on the
       platform). Additionallly, if the --guess-language-eagerly option is  given,  heuristic  testing  is  also
       performed to determine if a language parser applies. (See "Determining file language")

       If  a  language  was identified, the file is opened and then the appropriate language parser is called to
       operate on the currently open file. The parser parses through the file and adds an entry to the tag  file
       for  each  language  object  it  is written to handle. See "TAG FILE FORMAT", below, for details on these
       entries.

       This implementation of ctags-universal imposes  no  formatting  requirements  on  C  code  as  do  legacy
       implementations.  Older  implementations  of  ctags tended to rely upon certain formatting assumptions in
       order to help it resolve coding dilemmas caused by preprocessor conditionals.

       In  general,  ctags-universal  tries  to  be  smart  about  conditional  preprocessor  directives.  If  a
       preprocessor  conditional  is encountered within a statement which defines a tag, ctags-universal follows
       only the first branch of that conditional (except in the special case  of  "#if  0",  in  which  case  it
       follows  only  the last branch). The reason for this is that failing to pursue only one branch can result
       in ambiguous syntax, as in the following example:

          #ifdef TWO_ALTERNATIVES
          struct {
          #else
          union {
          #endif
                  short a;
                  long b;
          }

       Both branches cannot be followed, or braces become unbalanced and ctags-universal would be unable to make
       sense of the syntax.

       If the application of this heuristic fails to properly parse a file, generally  due  to  complicated  and
       inconsistent  pairing  within  the  conditionals,  ctags-universal  will retry the file using a different
       heuristic which does not selectively follow conditional preprocessor branches, but instead falls back  to
       relying  upon a closing brace ("}") in column 1 as indicating the end of a block once any brace imbalance
       results from following a #if conditional branch.

       ctags-universal will also try to specially handle arguments lists enclosed in double sets of  parentheses
       in order to accept the following conditional construct:
          extern void foo __ARGS((int one, char two));

       Any name immediately preceding the "((" will be automatically ignored and the previous name will be used.

       C++  operator  definitions  are  specially  handled. In order for consistency with all types of operators
       (overloaded and conversion), the operator name in the tag file will always  be  preceded  by  the  string
       "operator " (i.e. even if the actual operator definition was written as "operator<<").

       After creating or appending to the tag file, it is sorted by the tag name, removing identical tag lines.

TAG FILE FORMAT

       When not running in etags mode, each entry in the tag file consists of a separate line, each looking like
       this in the most general case:

       tag_name<TAB>file_name<TAB>ex_cmd;"<TAB>extension_fields

       The fields and separators of these lines are specified as follows:

          1. tag name

          2. single tab character

          3. name of the file in which the object associated with the tag is located

          4. single tab character

          5. EX  command used to locate the tag within the file; generally a search pattern (either /pattern/ or
             ?pattern?) or line number (see --excmd). Tag file format 2 (see --format) extends this  EX  command
             under  certain  circumstances to include a set of extension fields (described below) embedded in an
             EX comment immediately appended to  the  EX  command,  which  leaves  it  backward-compatible  with
             original vi(1) implementations.

       A  few special tags are written into the tag file for internal purposes.  These tags are composed in such
       a way that they always sort to the top of the file. Therefore, the first two characters of these tags are
       used a magic number to detect a tag file for purposes of determining whether a valid tag  file  is  being
       overwritten rather than a source file.

       Note  that  the  name  of  each source file will be recorded in the tag file exactly as it appears on the
       command line. Therefore, if the path you specified on the  command  line  was  relative  to  the  current
       directory, then it will be recorded in that same manner in the tag file. See, however, the --tag-relative
       option for how this behavior can be modified.

       Extension fields are tab-separated key-value pairs appended to the end of the EX command as a comment, as
       described  above.  These  key  value  pairs appear in the general form "key:value". Their presence in the
       lines of the tag file are controlled by the --fields option. The possible keys and the meaning  of  their
       values are as follows:

       access Indicates the visibility of this class member, where value is specific to the language.

       file   Indicates that the tag has file-limited visibility. This key has no corresponding value.

       kind   Indicates the type, or kind, of tag. Its value is either one of the corresponding one-letter flags
              described under the various --kinds-<LANG> options above, or a full name. It is permitted (and is,
              in  fact, the default) for the key portion of this field to be omitted. The optional behaviors are
              controlled with the --fields option.

       implementation
              When present, this indicates a limited implementation (abstract vs.  concrete)  of  a  routine  or
              class,  where  value  is specific to the language ("virtual" or "pure virtual" for C++; "abstract"
              for Java).

       inherits
              When present, value. is a comma-separated list of classes from which this class is  derived  (i.e.
              inherits from).

       signature
              When  present,  value  is  a  language-dependent  representation  of the signature of a routine. A
              routine signature in its complete form specifies the return type  of  a  routine  and  its  formal
              argument  list.   This  extension field is presently supported only for C-based languages and does
              not include the return type.

       In addition, information on the scope of the tag definition may be available, with the key portion  equal
       to  some  language-dependent  construct  name  and  its value the name declared for that construct in the
       program.  This scope entry indicates the scope in which the tag was found.  For example, a tag  generated
       for a C structure member would have a scope looking like "struct:myStruct".

HOW TO USE WITH VI

       Vi  will, by default, expect a tag file by the name "tags" in the current directory. Once the tag file is
       built, the following commands exercise the tag indexing feature:

       vi -t tag
              Start vi and position the cursor at the file and line where "tag" is defined.

       :ta tag
              Find a tag.

       Ctrl-] Find the tag under the cursor.

       Ctrl-T Return to previous location before jump to tag (not widely implemented).

HOW TO USE WITH GNU EMACS

       Emacs will, by default, expect a tag file by the name "TAGS" in the current directory. Once the tag  file
       is built, the following commands exercise the tag indexing feature:

       M-x visit-tags-table <RET> FILE <RET>
              Select the tag file, "FILE", to use.

       M-. [TAG] <RET>
              Find the first definition of TAG. The default tag is the identifier under the cursor.

       M-*    Pop back to where you previously invoked "M-.".

       C-u M-.
              Find the next definition for the last tag.

       For more commands, see the Tags topic in the Emacs info document.

HOW TO USE WITH NEDIT

       NEdit version 5.1 and later can handle the new extended tag file format (see --format). To make NEdit use
       the  tag  file,  select  "File->Load Tags File". To jump to the definition for a tag, highlight the word,
       then press Ctrl-D. NEdit 5.1 can read multiple tag  files  from  different  directories.  Setting  the  X
       resource  nedit.tagFile  to the name of a tag file instructs NEdit to automatically load that tag file at
       startup time.

CAVEATS

       Because ctags-universal is neither a preprocessor nor a compiler, use of  preprocessor  macros  can  fool
       ctags-universal   into  either  missing  tags  or  improperly  generating  inappropriate  tags.  Although
       ctags-universal has been designed to handle certain common cases, this is the  single  biggest  cause  of
       reported  problems. In particular, the use of preprocessor constructs which alter the textual syntax of C
       can fool ctags-universal. You can work around many such problems by using the -I option.

       Note that since ctags-universal generates patterns for locating tags (see  the  --excmd  option),  it  is
       entirely  possible  that  the  wrong line may be found by your editor if there exists another source line
       which is identical to the line containing the tag. The following example demonstrates this condition:

          int variable;

          /* ... */
          void foo(variable)
          int variable;
          {
                  /* ... */
          }

       Depending upon which editor you use and where in the code you happen to  be,  it  is  possible  that  the
       search  pattern  may  locate  the  local parameter declaration in foo() before it finds the actual global
       variable definition, since the lines (and therefore their search patterns are identical).   This  can  be
       avoided by use of the --excmd=n option.

BUGS

       ctags-universal has more options than ls(1).

       When  parsing  a  C++  member  function  definition  (e.g. "className::function"), ctags-universal cannot
       determine whether the scope specifier is a class name or a namespace specifier and always lists it  as  a
       class  name  in  the scope portion of the extension fields. Also, if a C++ function is defined outside of
       the class declaration (the usual case), the access specification (i.e. public, protected, or private) and
       implementation information (e.g. virtual, pure virtual) contained in the  function  declaration  are  not
       known when the tag is generated for the function definition. It will, however be available for prototypes
       (e.g. "--c++-kinds=+p").

       No qualified tags are generated for language objects inherited into a class.

ENVIRONMENT VARIABLES

       CTAGS  If this environment variable exists, it will be expected to contain a set of default options which
              are  read  when  ctags-universal starts, after the configuration files listed in FILES, below, are
              read, but before any command line options are read. Options appearing on  the  command  line  will
              override  options  specified in this variable.  Only options will be read from this variable. Note
              that all white space in this variable is considered a separator, making it impossible to  pass  an
              option  parameter  containing  an  embedded  space. If this is a problem, use a configuration file
              instead.

       ETAGS  Similar to the CTAGS variable above, this variable, if found, will be read when etags  starts.  If
              this variable is not found, etags will try to use CTAGS instead.

       TMPDIR On  Unix-like  hosts  where  mkstemp()  is  available,  the  value  of this variable specifies the
              directory in which to place temporary files.  This can be useful if the size of a  temporary  file
              becomes  too  large  to  fit  on  the partition holding the default temporary directory defined at
              compilation time. ctags-universal creates temporary files only if either (1)  an  emacs-style  tag
              file is being generated, (2) the tag file is being sent to standard output, or (3) the program was
              compiled  to  use  an internal sort algorithm to sort the tag files instead of the sort utility of
              the operating system.  If the sort utility  of  the  operating  system  is  being  used,  it  will
              generally  observe this variable also. Note that if ctags-universal is setuid, the value of TMPDIR
              will be ignored.

FILES

       $HOME/.ctags.d/*.ctags

       $HOMEDRIVE$HOMEPATH/ctags.d/*.ctags (on MSWindows only)

       .ctags.d/*.ctags

       ctags.d/*.ctags
          If any of these configuration files exist, each will be expected to contain a set of  default  options
          which  are  read  in  the  order  listed when ctags-universal starts, but before the CTAGS environment
          variable is read or any command line options are read. This makes it possible to set  up  personal  or
          project-level  defaults. It is possible to compile ctags-universal to read an additional configuration
          file before any of those shown above, which will be indicated if the output produced by the  --version
          option  lists the "custom-conf" feature. Options appearing in the CTAGS environment variable or on the
          command line will override options specified in these files. Only options  will  be  read  from  these
          files.  Note  that  the  option  files  are read in line-oriented mode in which spaces are significant
          (since shell quoting is not possible) but spaces at the beginning of a line are ignored. Each line  of
          the  file is read as one command line parameter (as if it were quoted with single quotes).  Therefore,
          use new lines to indicate separate command-line arguments.  A line starting with '#' is treated  as  a
          comment.

          *.ctags files in a directory are loaded in alphabetical order.

       tags   The default tag file created by ctags-universal.

       TAGS   The default tag file created by etags.

SEE ALSO

       See ctags-optlib(7) for defining (or extending) a parser in a configuration file.

       The official Universal-ctags web site at:

       https://ctags.io/

       Also  ex(1),  vi(1),  elvis,  or, better yet, vim, the official editor of ctags.  For more information on
       vim, see the VIM Pages web site at:

       http://www.vim.org/

AUTHOR

       Universal-ctags project https://ctags.io

       Darren Hiebert <dhiebert@users.sourceforge.net> http://DarrenHiebert.com/

MOTIVATION

       "Think ye at all times of rendering some service to every member of the human race."

       "All effort and exertion put forth by man from the fullness of his heart is worship, if it is prompted by
       the highest motives and the will to do service to humanity."

       -- From the Baha'i Writings

CREDITS

       This version of ctags-universal (Universal-ctags) derived from the repository,  known  as  fishman-ctags,
       started by Reza Jelveh.

       Some parsers are taken from tagmanager of Geany (https://www.geany.org/) project.

       The fishman-ctags was derived from Exuberant-ctags.

       Exuberant-ctags  was  originally  derived  from  and inspired by the ctags program by Steve Kirkendall <‐
       kirkenda@cs.pdx.edu> that comes with the Elvis vi clone (though  virtually  none  of  the  original  code
       remains).

       Credit  is also due Bram Moolenaar <Bram@vim.org>, the author of vim, who has devoted so much of his time
       and energy both to developing the editor as a service to others, and to helping the orphans of Uganda.

       The section entitled "HOW TO USE WITH GNU EMACS" was shamelessly stolen from the info page for GNU etags.

0.0.0                                                                                         CTAGS-UNIVERSAL(1)