{
    "content": [
        {
            "type": "text",
            "text": "# ctags (man)\n\n## NAME\n\nctags - Generate tag files for source code\n\n## SYNOPSIS\n\nctags [options] [file(s)]\netags [options] [file(s)]\n\n## DESCRIPTION\n\nThe  ctags  and  etags  programs (hereinafter collectively referred to as ctags, except where\ndistinguished) generate an index (or \"tag\") file for a variety of language objects  found  in\nfile(s).   This tag file allows these items to be quickly and easily located by a text editor\nor other utility. A \"tag\" signifies a language object for which an index entry  is  available\n(or, alternatively, the index entry created for that object).\n\n## TLDR\n\n> Generate an index (or tag) file of language objects found in source files for many popular programming languages.\n\n- Generate tags for a single file and output them to a file named \"tags\" in the current directory, overwriting the file if it exists:\n  `ctags {{path/to/file}}`\n- Generate tags for all files in the current directory and output them to a specific file, overwriting the file if it exists:\n  `ctags -f {{path/to/file}} *`\n- Generate tags for all files in the current directory and all subdirectories:\n  `ctags --recurse`\n- Generate tags for a single file and output them with start line number and end line number in JSON format:\n  `ctags --fields=+ne --output-format=json {{path/to/file}}`\n\n*Source: tldr-pages*\n\n## Sections\n\n- **NAME**\n- **SYNOPSIS**\n- **DESCRIPTION**\n- **SOURCE FILES**\n- **OPTIONS** (17 subsections)\n- **OPERATIONAL DETAILS**\n- **TAG FILE FORMAT**\n- **HOW TO USE WITH VI**\n- **HOW TO USE WITH GNU EMACS**\n- **HOW TO USE WITH NEDIT**\n- **CAVEATS**\n- **BUGS**\n- **ENVIRONMENT VARIABLES**\n- **FILES**\n- **SEE ALSO**\n- **AUTHOR**\n- **MOTIVATION**\n- **CREDITS**\n\nUse structuredContent.sections for detailed options, examples, and full documentation.\n"
        }
    ],
    "structuredContent": {
        "command": "ctags",
        "section": "",
        "mode": "man",
        "summary": "ctags - Generate tag files for source code",
        "synopsis": "ctags [options] [file(s)]\netags [options] [file(s)]",
        "tldr_summary": "Generate an index (or tag) file of language objects found in source files for many popular programming languages.",
        "tldr_examples": [
            {
                "description": "Generate tags for a single file and output them to a file named \"tags\" in the current directory, overwriting the file if it exists",
                "command": "ctags {{path/to/file}}"
            },
            {
                "description": "Generate tags for all files in the current directory and output them to a specific file, overwriting the file if it exists",
                "command": "ctags -f {{path/to/file}} *"
            },
            {
                "description": "Generate tags for all files in the current directory and all subdirectories",
                "command": "ctags --recurse"
            },
            {
                "description": "Generate tags for a single file and output them with start line number and end line number in JSON format",
                "command": "ctags --fields=+ne --output-format=json {{path/to/file}}"
            }
        ],
        "tldr_source": "official",
        "flags": [
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "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 off 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, 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 pat- terns 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; also be aware that wildcards can match the slash character, '/'). You can determine if shell wildcards are available on your plat- form by examining the output of the --version option, which will include \"+wildcards\" in the compiled feature list; otherwise, pattern is matched against file names using a sim- ple 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 ex- clude list contains \"EIFGEN\", \"SCCS\", \"RCS\", and \"CVS\", which are names of directories for which it is generally not desirable to descend while processing the --recurse op- tion. --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 advan- tages: 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, below). 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 op- tion 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 gen- erated. 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 gener- ated 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 cor- responding source lines are generally identical, making pattern searches use- less for finding all matches. --extra=[+|-]flags Specifies whether to include extra tag entries for certain kinds of information. The pa- rameter flags is a set of one-letter flags, each representing one kind of extra tag en- try 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. The meaning of each flag is as follows: f Include an entry for the base file name of every source file (e.g. \"example.c\"), which addresses the first line of the file. q Include an extra class-qualified tag entry for each tag which is a member of a class (for languages for which this information is extracted; currently C++, Eif- fel, and Java). 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 quali- fied calls are specified in the language). For C++, it is in the form \"class::member\"; for Eiffel and Java, it is in the form \"class.member\". 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 dou- ble the size of the tag file. --fields=[+|-]flags Specifies the available extension fields which are to be included in the entries of the tag file (see TAG FILE FORMAT, below, for more information). The parameter flags is a set of one-letter flags, each representing one type of extension field to include, with the following meanings (disabled by default unless indicated): a Access (or export) of class members f File-restricted scoping [enabled] i Inheritance information k Kind of tag as a single letter [enabled] K Kind of tag as full name l Language of source file containing tag m Implementation information n Line number of tag definition s Scope of tag definition [enabled] S Signature of routine (e.g. prototype or parameter list) z Include the \"kind:\" key in kind field t Type and name of a variable or typedef as \"typeref:\" field [enabled] 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 kinds explicitly listed in flags will be included in the output (i.e. overriding the de- fault set). This option is ignored if the option --format=1 has been specified. The de- fault value of this option is fkst."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "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."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Causes ctags to 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 --sorted 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 op- tion. 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 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 al- ways 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 ex- tended format containing extension fields (but in a manner which retains backward-com- patibility with original vi(1) implementations). The default level is 2. This option must appear before the first file name. [Ignored in etags mode]"
            },
            {
                "flag": "",
                "long": "--help",
                "arg": null,
                "description": "Prints to standard output a detailed usage description, and then exits."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "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). Be- cause 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 pre- processor conditionals are too complex follows all branches of a conditional. This op- tion is disabled by default. --<LANG>-kinds=[+|-]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 pa- rameter 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 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). As an example for the C language, in order to add prototypes and external variable dec- larations 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. --langdef=name Defines a new user-defined language, name, to be parsed with regular expressions. Once defined, name may be used in other options taking language names. The typical use of this option is to first define the language, then map file names to it using --langmap, then specify regular expressions using --regex-<LANG> to define how its tags are found. --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 ex- tension 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). You can determine if shell wildcards are available on your plat- form by examining the output of the --version 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, it will first be unmapped from any other languages. If the first character in a map is a plus sign, then the extensions and file name pat- terns 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 exten- sions 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 lan- guage), specify an empty extension list (e.g. \"--langmap=fortran:\"). To restore the de- fault language mappings for all a particular language, supply the keyword \"default\" for the mapping. To specify restore the default language mappings for all languages, spec- ify \"--langmap=default\". Note that file extensions are tested before file name patterns when inferring the language of a file. --language-force=language By default, ctags 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 au- tomatically 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-de- fined). If the first language of list is not preceded by either a '+' or '-', the cur- rent list 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 re- moved from the current list, respectively. Thus, it becomes simple to replace the cur- rent list with a new one, or to add or remove languages from the current list. The ac- tual list of files for which tags will be generated depends upon the language extension mapping in effect (see the --langmap option). Note that 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 complete list of the built-in language names."
            },
            {
                "flag": "",
                "long": "--license",
                "arg": null,
                "description": "Prints a summary of the software license to standard output, and then exits."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Specifies whether \"#line\" directives should be recognized. These are present in the out- put 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 en- abled, this option will cause ctags to generate tag entries marked with the file names and line numbers of their locations original source file(s), instead of their actual lo- cations 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 as- sumed 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 --lan- guage-force option if the extension of the preprocessor output file is not known to ctags."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Indicates whether symbolic links (if supported) should be followed. When disabled, sym- bolic links are ignored. This option is on by default."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Lists the tag kinds recognized for either the specified language or all languages, and then exits. Each kind of tag recorded in the tag file is represented by a one-letter flag, which is also used to filter the tags placed into the output through use of the --<LANG>-kinds option. Note that some languages and/or tag kinds may be implemented us- ing regular expressions and may not be available if regex support is not compiled into ctags (see the --regex-<LANG> option). Each kind listed is enabled unless followed by \"[off]\"."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Lists the file extensions and file name patterns which associate a file name with a lan- guage for either the specified language or all languages, and then exits. See the --langmap option, and SOURCE FILES, above."
            },
            {
                "flag": "",
                "long": "--list-languages",
                "arg": null,
                "description": "Lists the names of the languages understood by ctags, and then exits. These language names are case insensitive and may be used in the --language-force, --languages, --<LANG>-kinds, and --regex-<LANG> options. --options=file Read additional options from file. The file should contain one option per line. As a special case, if --options=NONE is specified as the first option on the command line, it will disable the automatic reading of any configuration options from either a file or the environment (see FILES)."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Recurse into directories encountered in the list of supplied files. If the list of sup- plied 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 -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 --ex- clude to limit recursion. --regex-<LANG>=/regexp/replacement/[kind-spec/][flags] The /regexp/replacement/ pair define a regular expression replacement pattern, similar in style to sed substitution commands, with which to generate tags from source files mapped to the named language, <LANG>, (case-insensitive; either a built-in or user-de- fined language). The regular expression, regexp, defines an extended regular expression (roughly that used by egrep(1)), which is used to locate a single source line containing a tag and may specify tab characters using \\t. When a matching line is found, a tag will be generated for the name defined by replacement, which generally will contain the spe- cial back-references \\1 through \\9 to refer to matching sub-expression groups within regexp. The '/' separator characters shown in the parameter to the option can actually be replaced by any character. Note that whichever separator character is used will have to be escaped with a backslash ('\\') character wherever it is used in the parameter as something other than a separator. The regular expression defined by this option is added to the current list of regular expressions for the specified language unless the parame- ter is omitted, in which case the current list is cleared. Unless modified by flags, regexp is interpreted as a Posix extended regular expression. The replacement should expand for all matching lines to a non-empty string of charac- ters, or a warning message will be reported. An optional kind specifier for tags match- ing regexp may follow replacement, which will determine what kind of tag is reported in the \"kind\" extension field (see TAG FILE FORMAT, below). The full form of kind-spec is in the form of a single letter, a comma, a name (without spaces), a comma, a descrip- tion, followed by a separator, which specify the short and long forms of the kind value and its textual description (displayed using --list-kinds). Either the kind name and/or the description may be omitted. If kind-spec is omitted, it defaults to \"r,regex\". Fi- nally, flags are one or more single-letter characters having the following effect upon the interpretation of regexp: b The pattern is interpreted as a Posix basic regular expression. e The pattern is interpreted as a Posix extended regular expression (default). i The regular expression is to be applied in a case-insensitive manner. Note that this option is available only if ctags was compiled with support for regular expressions, which depends upon your platform. You can determine if support for regular expressions is compiled in by examining the output of the --version option, which will include \"+regex\" in the compiled feature list. For more information on the regular expressions used by ctags, see either the regex(5,7) man page, or the GNU info documentation for regex (e.g. \"info regex\")."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "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 insen- sitive (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 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]"
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Indicates that the file paths recorded in the tag file should be relative to the direc- tory 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."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Prints statistics about the source files read and the tag file written during the cur- rent invocation of ctags. This option is off by default. This option must appear before the first file name."
            },
            {
                "flag": "",
                "long": null,
                "arg": null,
                "description": "Enable verbose mode. This prints out information on option processing and a brief mes- sage describing what action is being taken for each file considered by ctags. Normally, ctags does not read command line arguments until after options are read from the config- uration 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."
            },
            {
                "flag": "",
                "long": "--version",
                "arg": null,
                "description": "Prints a version identifier for ctags to standard output, and then exits. This is guar- anteed to always contain the string \"Exuberant Ctags\"."
            }
        ],
        "examples": [],
        "see_also": [
            {
                "name": "ex",
                "section": "1",
                "url": "https://www.chedong.com/phpMan.php/man/ex/1/json"
            },
            {
                "name": "vi",
                "section": "1",
                "url": "https://www.chedong.com/phpMan.php/man/vi/1/json"
            }
        ],
        "section_outline": [
            {
                "name": "NAME",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "SYNOPSIS",
                "lines": 4,
                "subsections": []
            },
            {
                "name": "DESCRIPTION",
                "lines": 22,
                "subsections": []
            },
            {
                "name": "SOURCE FILES",
                "lines": 15,
                "subsections": []
            },
            {
                "name": "OPTIONS",
                "lines": 148,
                "subsections": [
                    {
                        "name": "--append[=yes|no]",
                        "lines": 113
                    },
                    {
                        "name": "--file-scope[=yes|no]",
                        "lines": 4
                    },
                    {
                        "name": "--filter[=yes|no]",
                        "lines": 26
                    },
                    {
                        "name": "--help",
                        "lines": 2,
                        "long": "--help"
                    },
                    {
                        "name": "--if0[=yes|no]",
                        "lines": 85
                    },
                    {
                        "name": "--license",
                        "lines": 2,
                        "long": "--license"
                    },
                    {
                        "name": "--line-directives[=yes|no]",
                        "lines": 14
                    },
                    {
                        "name": "--links[=yes|no]",
                        "lines": 3
                    },
                    {
                        "name": "--list-kinds[=language|all]",
                        "lines": 8
                    },
                    {
                        "name": "--list-maps[=language|all]",
                        "lines": 4
                    },
                    {
                        "name": "--list-languages",
                        "lines": 10,
                        "long": "--list-languages"
                    },
                    {
                        "name": "--recurse[=yes|no]",
                        "lines": 50
                    },
                    {
                        "name": "--sort[=yes|no|foldcase]",
                        "lines": 7
                    },
                    {
                        "name": "--tag-relative[=yes|no]",
                        "lines": 6
                    },
                    {
                        "name": "--totals[=yes|no]",
                        "lines": 4
                    },
                    {
                        "name": "--verbose[=yes|no]",
                        "lines": 7
                    },
                    {
                        "name": "--version",
                        "lines": 3,
                        "long": "--version"
                    }
                ]
            },
            {
                "name": "OPERATIONAL DETAILS",
                "lines": 53,
                "subsections": []
            },
            {
                "name": "TAG FILE FORMAT",
                "lines": 63,
                "subsections": []
            },
            {
                "name": "HOW TO USE WITH VI",
                "lines": 11,
                "subsections": []
            },
            {
                "name": "HOW TO USE WITH GNU EMACS",
                "lines": 16,
                "subsections": []
            },
            {
                "name": "HOW TO USE WITH NEDIT",
                "lines": 6,
                "subsections": []
            },
            {
                "name": "CAVEATS",
                "lines": 25,
                "subsections": []
            },
            {
                "name": "BUGS",
                "lines": 12,
                "subsections": []
            },
            {
                "name": "ENVIRONMENT VARIABLES",
                "lines": 21,
                "subsections": []
            },
            {
                "name": "FILES",
                "lines": 24,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 9,
                "subsections": []
            },
            {
                "name": "AUTHOR",
                "lines": 3,
                "subsections": []
            },
            {
                "name": "MOTIVATION",
                "lines": 7,
                "subsections": []
            },
            {
                "name": "CREDITS",
                "lines": 12,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "ctags - Generate tag files for source code\n",
                "subsections": []
            },
            "SYNOPSIS": {
                "content": "ctags [options] [file(s)]\n\netags [options] [file(s)]\n",
                "subsections": []
            },
            "DESCRIPTION": {
                "content": "The  ctags  and  etags  programs (hereinafter collectively referred to as ctags, except where\ndistinguished) generate an index (or \"tag\") file for a variety of language objects  found  in\nfile(s).   This tag file allows these items to be quickly and easily located by a text editor\nor other utility. A \"tag\" signifies a language object for which an index entry  is  available\n(or, alternatively, the index entry created for that object).\n\nAlternatively, ctags can generate a cross reference file which lists, in human readable form,\ninformation about the various source objects found in a set of language files.\n\nTag index files are supported by numerous editors, which allow the user to locate the  object\nassociated with a name appearing in a source file and jump to the file and line which defines\nthe name. Those known about at the time of this release are:\n\nVi(1) and its derivatives (e.g. Elvis, Vim, Vile, Lemmy), CRiSP, Emacs, FTE (Folding Text\nEditor),  JED,  jEdit,  Mined, NEdit (Nirvana Edit), TSE (The SemWare Editor), UltraEdit,\nWorkSpace, X2, Zeus\n\nCtags is capable of generating different kinds of tags for each of many different  languages.\nFor  a  complete list of supported languages, the names by which they are recognized, and the\nkinds of tags which are generated for each, see the  --list-languages  and  --list-kinds  op-\ntions.\n",
                "subsections": []
            },
            "SOURCE FILES": {
                "content": "Unless the --language-force option is specified, the language of each source file is automat-\nically selected based upon a mapping of file names to languages. The mappings in  effect  for\neach  language  may  be  display  using  the  --list-maps option and may be changed using the\n--langmap option.  On platforms which support it, if the name of a file is not  mapped  to  a\nlanguage and the file is executable, the first line of the file is checked to see if the file\nis a \"#!\" script for a recognized language.\n\nBy default, all other files names are ignored. This permits running ctags on all files in ei-\nther  a single directory (e.g. \"ctags *\"), or on all files in an entire source directory tree\n(e.g. \"ctags -R\"), since only those files  whose  names  are  mapped  to  languages  will  be\nscanned.\n\n[The  reason  that .h extensions are mapped to C++ files rather than C files is because it is\ncommon to use .h extensions in C++, and no harm results in treating them as C++ files.]\n",
                "subsections": []
            },
            "OPTIONS": {
                "content": "Despite the wealth of available options, defaults are set so that ctags is most commonly exe-\ncuted  without  any  options (e.g. \"ctags *\", or \"ctags -R\"), which will create a tag file in\nthe current directory for all recognized source files. The options described below  are  pro-\nvided merely to allow custom tailoring to meet special needs.\n\nNote that spaces separating the single-letter options from their parameters are optional.\n\nNote also that the boolean parameters to the long form options (those beginning with \"--\" and\nthat take a \"[=yes|no]\" parameter) may be omitted, in which case  \"=yes\"  is  implied.  (e.g.\n--sort is equivalent to --sort=yes). Note further that \"=1\" and \"=on\" are considered synonyms\nfor \"=yes\", and that \"=0\" and \"=off\" are considered synonyms for \"=no\".\n\nSome options are either ignored or useful only when used while running in etags mode (see  -e\noption). Such options will be noted.\n\nMost options may appear anywhere on the command line, affecting only those files which follow\nthe option. A few options, however, must appear before the first file name and will be  noted\nas such.\n\nOptions  taking language names will accept those names in either upper or lower case. See the\n--list-languages option for a complete list of the built-in language names.\n\n-a   Equivalent to --append.\n\n-B   Use backward searching patterns (e.g. ?pattern?). [Ignored in etags mode]\n\n-e   Enable etags mode, which will create a tag file for use with the Emacs editor.  Alterna-\ntively, if ctags is invoked by a name containing the string \"etags\" (either by renaming,\nor creating a link to, the executable), etags mode will be enabled. This option must ap-\npear before the first file name.\n\n-f tagfile\nUse  the  name  specified by tagfile for the tag file (default is \"tags\", or \"TAGS\" when\nrunning in etags mode). If tagfile is specified as \"-\", then the tag file is written  to\nstandard  output  instead. Ctags will stubbornly refuse to take orders if tagfile exists\nand its first line contains something other than a valid tags line. This will save  your\nneck if you mistakenly type \"ctags -f *.c\", which would otherwise overwrite your first C\nfile with the tags generated by the rest! It will also refuse to accept a  multi-charac-\nter  file  name  which  begins with a '-' (dash) character, since this most likely means\nthat you left out the tag file name and this option tried to grab the next option as the\nfile  name.  If  you  really  want  to  name your output tag file \"-ugly\", specify it as\n\"./-ugly\". This option must appear before the first file name. If this option is  speci-\nfied more than once, only the last will apply.\n\n-F   Use forward searching patterns (e.g. /pattern/) (default).  [Ignored in etags mode]\n\n-h list\nSpecifies  a  list of file extensions, separated by periods, which are to be interpreted\nas include (or header) files. To indicate files having no extension, use  a  period  not\nfollowed  by  a  non-period character (e.g. \".\", \"..x\", \".x.\"). This option only affects\nhow the scoping of a particular kinds of tags is interpreted (i.e. whether or  not  they\nare considered as globally visible or visible only within the file in which they are de-\nfined); it does not map the extension to any particular language. Any tag which  is  lo-\ncated  in  a  non-include  file and cannot be seen (e.g. linked to) from another file is\nconsidered to have file-limited (e.g. static) scope. No kind of tag appearing in an  in-\nclude  file will be considered to have file-limited scope. If the first character in the\nlist is a plus sign, then the extensions in the list will be  appended  to  the  current\nlist; otherwise, the list will replace the current list. See, also, the --file-scope op-\ntion. The default list is \".h.H.hh.hpp.hxx.h++.inc.def\". To restore  the  default  list,\nspecify  -h  default.  Note  that if an extension supplied to this option is not already\nmapped to a particular language (see SOURCE FILES, above), you will also need to use ei-\nther the --langmap or --language-force option.\n\n-I identifier-list\nSpecifies  a  list  of identifiers which are to be specially handled while parsing C and\nC++ source files. This option is specifically provided to handle special  cases  arising\nthrough  the  use of preprocessor macros. When the identifiers listed are simple identi-\nfiers, these identifiers will be ignored during parsing of the source files. If an iden-\ntifier is suffixed with a '+' character, ctags will also ignore any parenthesis-enclosed\nargument list which may immediately follow the identifier in the source  files.  If  two\nidentifiers  are  separated with the '=' character, the first identifiers is replaced by\nthe second identifiers for parsing purposes. The list of identifiers may be supplied di-\nrectly  on  the  command line or read in from a separate file. If the first character of\nidentifier-list is '@', '.' or a pathname separator ('/' or '\\'), or the first two char-\nacters  specify a drive letter (e.g. \"C:\"), the parameter identifier-list will be inter-\npreted as a filename from which to read a list of identifiers, one per input line.  Oth-\nerwise,  identifier-list  is a list of identifiers (or identifier pairs) to be specially\nhandled, each delimited by a either a comma or by white space (in which  case  the  list\nshould  be quoted to keep the entire list as one command line argument). Multiple -I op-\ntions may be supplied.  To clear the list of ignore identifiers, supply  a  single  dash\n(\"-\") for identifier-list.\n\nThis  feature  is useful when preprocessor macros are used in such a way that they cause\nsyntactic confusion due to their presence. Indeed, this  is  the  best  way  of  working\naround  a  number  of problems caused by the presence of syntax-busting macros in source\nfiles (see CAVEATS, below). Some examples will illustrate this point.\n\nint foo ARGDECL4(void *, ptr, long int, nbytes)\n\nIn the above example, the macro \"ARGDECL4\" would be mistakenly  interpreted  to  be  the\nname  of  the  function instead of the correct name of \"foo\". Specifying -I ARGDECL4 re-\nsults in the correct behavior.\n\n/* creates an RCS version string in module */\nMODULEVERSION(\"$Revision: 750 $\")\n\nIn the above example the macro invocation looks too much like a function definition  be-\ncause  it  is not followed by a semicolon (indeed, it could even be followed by a global\nvariable definition that would look much like a K&R style  function  parameter  declara-\ntion).  In  fact, this seeming function definition could possibly even cause the rest of\nthe file to be skipped over while trying to complete the definition. Specifying -I  MOD-\nULEVERSION+ would avoid such a problem.\n\nCLASS Example {\n// your content here\n};\n\nThe  example  above uses \"CLASS\" as a preprocessor macro which expands to something dif-\nferent for each platform. For instance CLASS may be defined as \"class  declspec(dllex-\nport)\"  on Win32 platforms and simply \"class\" on UNIX.  Normally, the absence of the C++\nkeyword \"class\" would cause the source file to be incorrectly parsed.  Correct  behavior\ncan be restored by specifying -I CLASS=class.\n\n-L file\nRead  from  file  a  list  of file names for which tags should be generated.  If file is\nspecified as \"-\", then file names are read from standard input. File  names  read  using\nthis  option  are  processed following file names appearing on the command line. Options\nare also accepted in this input. If this option is specified more than  once,  only  the\nlast  will apply. Note: file is read in line-oriented mode, where a new line is the only\ndelimiter and non-trailing white space is considered significant,  in  order  that  file\nnames  containing spaces may be supplied (however, trailing white space is stripped from\nlines); this can affect how options are parsed if included in the input.\n\n-n   Equivalent to --excmd=number.\n\n-N   Equivalent to --excmd=pattern.\n\n-o tagfile\nEquivalent to -f tagfile.\n\n-R   Equivalent to --recurse.\n\n-u   Equivalent to --sort=no (i.e. \"unsorted\").\n\n-V   Equivalent to --verbose.\n\n-w   This option is silently ignored for backward-compatibility with the ctags of SVR4 Unix.\n\n-x   Print a tabular, human-readable cross reference (xref) file to standard  output  instead\nof  generating  a  tag  file.  The information contained in the output includes: the tag\nname; the kind of tag; the line number, file name, and source  line  (with  extra  white\nspace  condensed)  of the file which defines the tag. No tag file is written and all op-\ntions affecting tag file output will be ignored. Example applications for  this  feature\nare  generating  a  listing  of  all  functions  located in a source file (e.g. ctags -x\n--c-kinds=f file), or generating a list of all externally visible global  variables  lo-\ncated  in  a  source  file (e.g. ctags -x --c-kinds=v --file-scope=no file). This option\nmust appear before the first file name.\n",
                "subsections": [
                    {
                        "name": "--append[=yes|no]",
                        "content": "Indicates whether tags generated from the specified files should be  appended  to  those\nalready  present  in the tag file or should replace them. This option is off by default.\nThis option must appear before the first file name.\n\n--etags-include=file\nInclude a reference to file in the tag file. This option may be specified as many  times\nas desired. This supports Emacs' capability to use a tag file which \"includes\" other tag\nfiles. [Available only in etags mode]\n\n--exclude=[pattern]\nAdd pattern to a list of excluded files and directories. This option may be specified as\nmany  times  as  desired. For each file name considered by ctags, each pattern specified\nusing  this  option  will  be  compared   against   both   the   complete   path   (e.g.\nsome/path/base.ext)  and  the  base name (e.g. base.ext) of the file, thus allowing pat-\nterns which match a given file name irrespective of its path, or match only  a  specific\npath.  If  appropriate support is available from the runtime library of your C compiler,\nthen pattern may contain the usual shell wildcards (not regular expressions)  common  on\nUnix (be sure to quote the option parameter to protect the wildcards from being expanded\nby the shell before being passed to ctags; also be aware that wildcards  can  match  the\nslash  character, '/'). You can determine if shell wildcards are available on your plat-\nform by examining the output of the --version option, which will include \"+wildcards\" in\nthe compiled feature list; otherwise, pattern is matched against file names using a sim-\nple textual comparison.\n\nIf pattern begins with the character '@', then the rest of the string is interpreted  as\na  file  name  from which to read exclusion patterns, one per line. If pattern is empty,\nthe list of excluded patterns is cleared.  Note that at program startup, the default ex-\nclude  list  contains \"EIFGEN\", \"SCCS\", \"RCS\", and \"CVS\", which are names of directories\nfor which it is generally not desirable to descend while processing  the  --recurse  op-\ntion.\n\n--excmd=type\nDetermines  the  type of EX command used to locate tags in the source file.  [Ignored in\netags mode]\n\nThe valid values for type (either the entire word or the first letter is accepted) are:\n\nnumber   Use only line numbers in the tag file for locating tags. This has  four  advan-\ntages:\n1.  Significantly reduces the size of the resulting tag file.\n2.  Eliminates  failures  to  find  tags  because the line defining the tag has\nchanged, causing the pattern match to fail (note that some editors, such as\nvim, are able to recover in many such instances).\n3.  Eliminates  finding  identical  matching,  but incorrect, source lines (see\nBUGS, below).\n4.  Retains separate entries in the tag file for lines which are  identical  in\ncontent.  In pattern mode, duplicate entries are dropped because the search\npatterns they generate are identical, making the duplicate entries useless.\n\nHowever, this option has one significant drawback: changes to the source  files\ncan  cause the line numbers recorded in the tag file to no longer correspond to\nthe lines in the source file, causing jumps to some tags  to  miss  the  target\ndefinition  by  one or more lines. Basically, this option is best used when the\nsource code to which it is applied is not subject to change. Selecting this op-\ntion type causes the following options to be ignored: -BF.\n\npattern  Use  only  search  patterns  for all tags, rather than the line numbers usually\nused for macro definitions. This has the advantage of not referencing  obsolete\nline  numbers when lines have been added or removed since the tag file was gen-\nerated.\n\nmixed    In this mode, patterns are generally used with a few exceptions.  For  C,  line\nnumbers  are used for macro definition tags. This was the default format gener-\nated by the original ctags and is, therefore, retained as the default for  this\noption. For Fortran, line numbers are used for common blocks because their cor-\nresponding source lines are generally identical, making pattern  searches  use-\nless for finding all matches.\n\n--extra=[+|-]flags\nSpecifies whether to include extra tag entries for certain kinds of information. The pa-\nrameter flags is a set of one-letter flags, each representing one kind of extra tag  en-\ntry to include in the tag file. If flags is preceded by either the '+' or '-' character,\nthe effect of each flag is added to, or removed from, those currently enabled; otherwise\nthe flags replace any current settings. The meaning of each flag is as follows:\n\nf   Include an entry for the base file name of every source file (e.g.  \"example.c\"),\nwhich addresses the first line of the file.\n\nq   Include an extra class-qualified tag entry for each tag which is a  member  of  a\nclass (for languages for which this information is extracted; currently C++, Eif-\nfel, and Java). The actual form of the qualified tag depends  upon  the  language\nfrom  which the tag was derived (using a form that is most natural for how quali-\nfied calls  are  specified  in  the  language).  For  C++,  it  is  in  the  form\n\"class::member\";  for Eiffel and Java, it is in the form \"class.member\". This may\nallow easier location of a specific tags when multiple occurrences of a tag  name\noccur  in the tag file. Note, however, that this could potentially more than dou-\nble the size of the tag file.\n\n--fields=[+|-]flags\nSpecifies the available extension fields which are to be included in the entries of  the\ntag  file  (see  TAG FILE FORMAT, below, for more information). The parameter flags is a\nset of one-letter flags, each representing one type of extension field to include,  with\nthe following meanings (disabled by default unless indicated):\n\na   Access (or export) of class members\nf   File-restricted scoping [enabled]\ni   Inheritance information\nk   Kind of tag as a single letter [enabled]\nK   Kind of tag as full name\nl   Language of source file containing tag\nm   Implementation information\nn   Line number of tag definition\ns   Scope of tag definition [enabled]\nS   Signature of routine (e.g. prototype or parameter list)\nz   Include the \"kind:\" key in kind field\nt   Type and name of a variable or typedef as \"typeref:\" field [enabled]\n\nEach  letter  or group of letters may be preceded by either '+' to add it to the default\nset, or '-' to exclude it. In the absence of any preceding '+' or '-' sign,  only  those\nkinds explicitly listed in flags will be included in the output (i.e. overriding the de-\nfault set). This option is ignored if the option --format=1 has been specified. The  de-\nfault value of this option is fkst.\n"
                    },
                    {
                        "name": "--file-scope[=yes|no]",
                        "content": "Indicates  whether  tags  scoped  only for a single file (i.e. tags which cannot be seen\noutside of the file in which they are defined, such as \"static\" tags) should be included\nin the output. See, also, the -h option. This option is enabled by default.\n"
                    },
                    {
                        "name": "--filter[=yes|no]",
                        "content": "Causes  ctags  to  behave as a filter, reading source file names from standard input and\nprinting their tags to standard output on a file-by-file basis. If --sorted is  enabled,\ntags  are  sorted  only within the source file in which they are defined. File names are\nread from standard input in line-oriented input mode (see note for -L option)  and  only\nafter  file  names listed on the command line or from any file supplied using the -L op-\ntion. When this option is enabled, the options -f, -o, and --totals  are  ignored.  This\noption  is quite esoteric and is disabled by default. This option must appear before the\nfirst file name.\n\n--filter-terminator=string\nSpecifies a string to print to standard output following the tags  for  each  file  name\nparsed  when  the --filter option is enabled. This may permit an application reading the\noutput of ctags to determine when the output for each file is finished. Note that if the\nfile name read is a directory and --recurse is enabled, this string will be printed only\nonce at the end of all tags found for by descending the directory. This string will  al-\nways  be separated from the last tag line for the file by its terminating newline.  This\noption is quite esoteric and is empty by default. This option  must  appear  before  the\nfirst file name.\n\n--format=level\nChange  the format of the output tag file. Currently the only valid values for level are\n1 or 2. Level 1 specifies the original tag file format and level 2 specifies a  new  ex-\ntended  format  containing extension fields (but in a manner which retains backward-com-\npatibility with original vi(1) implementations). The default level  is  2.  This  option\nmust appear before the first file name. [Ignored in etags mode]\n"
                    },
                    {
                        "name": "--help",
                        "content": "Prints to standard output a detailed usage description, and then exits.\n",
                        "long": "--help"
                    },
                    {
                        "name": "--if0[=yes|no]",
                        "content": "Indicates  a  preference  as  to whether code within an \"#if 0\" branch of a preprocessor\nconditional should be examined for non-macro tags (macro tags are always included).  Be-\ncause  the intent of this construct is to disable code, the default value of this option\nis no. Note that this indicates a preference only and does not guarantee  skipping  code\nwithin  an \"#if 0\" branch, since the fall-back algorithm used to generate tags when pre-\nprocessor conditionals are too complex follows all branches of a conditional.  This  op-\ntion is disabled by default.\n\n--<LANG>-kinds=[+|-]kinds\nSpecifies  a list of language-specific kinds of tags (or kinds) to include in the output\nfile for a particular language, where <LANG> is  case-insensitive  and  is  one  of  the\nbuilt-in  language  names (see the --list-languages option for a complete list). The pa-\nrameter kinds is a group of one-letter flags designating kinds of  tags  (particular  to\nthe  language)  to either include or exclude from the output. The specific sets of flags\nrecognized for each language,  their  meanings  and  defaults  may  be  list  using  the\n--list-kinds  option.  Each  letter or group of letters may be preceded by either '+' to\nadd it to, or '-' to remove it from, the default set. In the absence  of  any  preceding\n'+'  or  '-'  sign,  only those kinds explicitly listed in kinds will be included in the\noutput (i.e.  overriding the default for the specified language).\n\nAs an example for the C language, in order to add prototypes and external variable  dec-\nlarations  to  the default set of tag kinds, but exclude macros, use --c-kinds=+px-d; to\ninclude only tags for functions, use --c-kinds=f.\n\n--langdef=name\nDefines a new user-defined language, name, to be parsed with regular  expressions.  Once\ndefined,  name  may  be  used in other options taking language names. The typical use of\nthis option is to first define the language, then map file names to it using  --langmap,\nthen specify regular expressions using --regex-<LANG> to define how its tags are found.\n\n--langmap=map[,map[...]]\nControls  how  file  names  are  mapped  to languages (see the --list-maps option). Each\ncomma-separated map consists of the language name (either  a  built-in  or  user-defined\nlanguage),  a colon, and a list of file extensions and/or file name patterns. A file ex-\ntension is specified by preceding the extension with a period (e.g. \".c\"). A  file  name\npattern  is specified by enclosing the pattern in parentheses (e.g. \"([Mm]akefile)\"). If\nappropriate support is available from the runtime library of your C compiler,  then  the\nfile name pattern may contain the usual shell wildcards common on Unix (be sure to quote\nthe option parameter to protect the wildcards from being expanded by  the  shell  before\nbeing passed to ctags). You can determine if shell wildcards are available on your plat-\nform by examining the output of the --version option, which will include \"+wildcards\" in\nthe  compiled  feature  list; otherwise, the file name patterns are matched against file\nnames using a simple textual comparison. When mapping a file extension, it will first be\nunmapped from any other languages.\n\nIf  the  first character in a map is a plus sign, then the extensions and file name pat-\nterns in that map will be appended to the current map for that language; otherwise,  the\nmap  will  replace  the current map. For example, to specify that only files with exten-\nsions of .c and .x are to be treated as C language  files,  use  \"--langmap=c:.c.x\";  to\nalso   add   files   with   extensions   of   .j   as   Java   language  files,  specify\n\"--langmap=c:.c.x,java:+.j\". To map  makefiles  (e.g.  files  named  either  \"Makefile\",\n\"makefile\",  or  having  the  extension  \".mak\")  to  a  language called \"make\", specify\n\"--langmap=make:([Mm]akefile).mak\".  To map files having no extension, specify a  period\nnot  followed  by  a non-period character (e.g. \".\", \"..x\", \".x.\"). To clear the mapping\nfor a particular language (thus inhibiting automatic generation of tags  for  that  lan-\nguage), specify an empty extension list (e.g.  \"--langmap=fortran:\"). To restore the de-\nfault language mappings for all a particular language, supply the keyword \"default\"  for\nthe  mapping.  To specify restore the default language mappings for all languages, spec-\nify \"--langmap=default\". Note that file extensions are tested before file name  patterns\nwhen inferring the language of a file.\n\n--language-force=language\nBy  default,  ctags  automatically selects the language of a source file, ignoring those\nfiles whose language cannot be determined (see SOURCE FILES, above). This option  forces\nthe  specified  language  (case-insensitive; either built-in or user-defined) to be used\nfor every supplied file instead of automatically selecting the language based  upon  its\nextension. In addition, the special value auto indicates that the language should be au-\ntomatically selected (which effectively disables this option).\n\n--languages=[+|-]list\nSpecifies the languages for which tag generation is  enabled,  with  list  containing  a\ncomma-separated  list  of  language names (case-insensitive; either built-in or user-de-\nfined). If the first language of list is not preceded by either a '+' or '-',  the  cur-\nrent  list  will be cleared before adding or removing the languages in list. Until a '-'\nis encountered, each language in the list will be added to the current list.  As  either\nthe  '+'  or '-' is encountered in the list, the languages following it are added or re-\nmoved from the current list, respectively. Thus, it becomes simple to replace  the  cur-\nrent  list  with a new one, or to add or remove languages from the current list. The ac-\ntual list of files for which tags will be generated depends upon the language  extension\nmapping  in  effect (see the --langmap option). Note that all languages, including user-\ndefined languages are enabled unless explicitly disabled  using  this  option.  Language\nnames  included  in  list  may  be  any built-in language or one previously defined with\n--langdef. The default is \"all\", which is also accepted as a  valid  argument.  See  the\n--list-languages option for a complete list of the built-in language names.\n"
                    },
                    {
                        "name": "--license",
                        "content": "Prints a summary of the software license to standard output, and then exits.\n",
                        "long": "--license"
                    },
                    {
                        "name": "--line-directives[=yes|no]",
                        "content": "Specifies whether \"#line\" directives should be recognized. These are present in the out-\nput of preprocessors and contain the line number, and possibly the  file  name,  of  the\noriginal  source file(s) from which the preprocessor output file was generated. When en-\nabled, this option will cause ctags to generate tag entries marked with the  file  names\nand line numbers of their locations original source file(s), instead of their actual lo-\ncations in the preprocessor output. The actual file names placed into the tag file  will\nhave  the  same leading path components as the preprocessor output file, since it is as-\nsumed that the original source files are located relative  to  the  preprocessor  output\nfile (unless, of course, the #line directive specifies an absolute path). This option is\noff by default. Note: This option is generally only useful when used together  with  the\n--excmd=number  (-n)  option.  Also,  you may have to use either the --langmap or --lan-\nguage-force option if the extension of the preprocessor output  file  is  not  known  to\nctags.\n"
                    },
                    {
                        "name": "--links[=yes|no]",
                        "content": "Indicates  whether symbolic links (if supported) should be followed. When disabled, sym-\nbolic links are ignored. This option is on by default.\n"
                    },
                    {
                        "name": "--list-kinds[=language|all]",
                        "content": "Lists the tag kinds recognized for either the specified language or all  languages,  and\nthen  exits.  Each  kind  of tag recorded in the tag file is represented by a one-letter\nflag, which is also used to filter the tags placed into the output through  use  of  the\n--<LANG>-kinds  option. Note that some languages and/or tag kinds may be implemented us-\ning regular expressions and may not be available if regex support is not  compiled  into\nctags  (see  the  --regex-<LANG> option). Each kind listed is enabled unless followed by\n\"[off]\".\n"
                    },
                    {
                        "name": "--list-maps[=language|all]",
                        "content": "Lists the file extensions and file name patterns which associate a file name with a lan-\nguage  for  either  the  specified  language  or  all languages, and then exits. See the\n--langmap option, and SOURCE FILES, above.\n"
                    },
                    {
                        "name": "--list-languages",
                        "content": "Lists the names of the languages understood by ctags, and then  exits.   These  language\nnames  are  case  insensitive  and  may  be  used  in the --language-force, --languages,\n--<LANG>-kinds, and --regex-<LANG> options.\n\n--options=file\nRead additional options from file. The file should contain one option  per  line.  As  a\nspecial case, if --options=NONE is specified as the first option on the command line, it\nwill disable the automatic reading of any configuration options from either  a  file  or\nthe environment (see FILES).\n",
                        "long": "--list-languages"
                    },
                    {
                        "name": "--recurse[=yes|no]",
                        "content": "Recurse  into directories encountered in the list of supplied files. If the list of sup-\nplied files is empty and no file list is specified with the -L option, then the  current\ndirectory  (i.e.  \".\")  is assumed. Symbolic links are followed. If you don't like these\nbehaviors, either explicitly specify the files or pipe the output of find(1) into  ctags\n-L-  instead.  Note:  This  option  is not supported on all platforms at present.  It is\navailable if the output of the --help option includes this option.  See, also, the --ex-\nclude to limit recursion.\n\n--regex-<LANG>=/regexp/replacement/[kind-spec/][flags]\nThe  /regexp/replacement/  pair define a regular expression replacement pattern, similar\nin style to sed substitution commands, with which to generate  tags  from  source  files\nmapped  to  the named language, <LANG>, (case-insensitive; either a built-in or user-de-\nfined language). The regular expression, regexp, defines an extended regular  expression\n(roughly that used by egrep(1)), which is used to locate a single source line containing\na tag and may specify tab characters using \\t. When a matching line is found, a tag will\nbe  generated for the name defined by replacement, which generally will contain the spe-\ncial back-references \\1 through \\9 to refer to  matching  sub-expression  groups  within\nregexp.  The  '/' separator characters shown in the parameter to the option can actually\nbe replaced by any character. Note that whichever separator character is used will  have\nto  be  escaped with a backslash ('\\') character wherever it is used in the parameter as\nsomething other than a separator. The regular expression defined by this option is added\nto the current list of regular expressions for the specified language unless the parame-\nter is omitted, in which case the current list is cleared.\n\nUnless modified by flags, regexp is interpreted as a Posix extended regular  expression.\nThe  replacement  should  expand for all matching lines to a non-empty string of charac-\nters, or a warning message will be reported. An optional kind specifier for tags  match-\ning  regexp may follow replacement, which will determine what kind of tag is reported in\nthe \"kind\" extension field (see TAG FILE FORMAT, below). The full form of  kind-spec  is\nin  the  form  of a single letter, a comma, a name (without spaces), a comma, a descrip-\ntion, followed by a separator, which specify the short and long forms of the kind  value\nand  its textual description (displayed using --list-kinds). Either the kind name and/or\nthe description may be omitted. If kind-spec is omitted, it defaults to  \"r,regex\".  Fi-\nnally,  flags  are one or more single-letter characters having the following effect upon\nthe interpretation of regexp:\n\nb   The pattern is interpreted as a Posix basic regular expression.\n\ne   The pattern is interpreted as a Posix extended regular expression (default).\n\ni   The regular expression is to be applied in a case-insensitive manner.\n\nNote that this option is available only if ctags was compiled with support  for  regular\nexpressions,  which depends upon your platform. You can determine if support for regular\nexpressions is compiled in by examining the output of the --version option,  which  will\ninclude \"+regex\" in the compiled feature list.\n\nFor more information on the regular expressions used by ctags, see either the regex(5,7)\nman page, or the GNU info documentation for regex (e.g. \"info regex\").\n"
                    },
                    {
                        "name": "--sort[=yes|no|foldcase]",
                        "content": "Indicates whether the tag file should be sorted on the tag name (default is  yes).  Note\nthat  the original vi(1) required sorted tags.  The foldcase value specifies case insen-\nsitive (or case-folded) sorting.  Fast binary searches of tag files  sorted  with  case-\nfolding  will  require special support from tools using tag files, such as that found in\nthe ctags readtags library, or Vim version 6.2 or higher (using \"set ignorecase\").  This\noption must appear before the first file name. [Ignored in etags mode]\n"
                    },
                    {
                        "name": "--tag-relative[=yes|no]",
                        "content": "Indicates  that the file paths recorded in the tag file should be relative to the direc-\ntory containing the tag file, rather than relative to the current directory, unless  the\nfiles  supplied  on the command line are specified with absolute paths. This option must\nappear before the first file name. The default is yes when running in  etags  mode  (see\nthe -e option), no otherwise.\n"
                    },
                    {
                        "name": "--totals[=yes|no]",
                        "content": "Prints  statistics  about the source files read and the tag file written during the cur-\nrent invocation of ctags. This option is off by default.  This option must appear before\nthe first file name.\n"
                    },
                    {
                        "name": "--verbose[=yes|no]",
                        "content": "Enable  verbose  mode. This prints out information on option processing and a brief mes-\nsage describing what action is being taken for each file considered by ctags.  Normally,\nctags does not read command line arguments until after options are read from the config-\nuration files (see FILES, below) and the CTAGS environment variable.  However,  if  this\noption is the first argument on the command line, it will take effect before any options\nare read from these sources. The default is no.\n"
                    },
                    {
                        "name": "--version",
                        "content": "Prints a version identifier for ctags to standard output, and then exits. This is  guar-\nanteed to always contain the string \"Exuberant Ctags\".\n",
                        "long": "--version"
                    }
                ]
            },
            "OPERATIONAL DETAILS": {
                "content": "As  ctags considers each file name in turn, it tries to determine the language of the file by\napplying the following three tests in order: if the file extension has been mapped to a  lan-\nguage, if the file name matches a shell pattern mapped to a language, and finally if the file\nis executable and its first line specifies an interpreter using the Unix-style \"#!\"  specifi-\ncation  (if  supported on the platform). If a language was identified, the file is opened and\nthen the appropriate language parser is called to operate on the  currently  open  file.  The\nparser  parses through the file and adds an entry to the tag file for each language object it\nis written to handle. See TAG FILE FORMAT, below, for details on these entries.\n\nThis implementation of ctags imposes no formatting requirements on C code as do legacy imple-\nmentations. Older implementations of ctags tended to rely upon certain formatting assumptions\nin order to help it resolve coding dilemmas caused by preprocessor conditionals.\n\nIn general, ctags tries to be smart about conditional  preprocessor  directives.  If  a  pre-\nprocessor  conditional  is  encountered within a statement which defines a tag, ctags follows\nonly the first branch of that conditional (except in the special case of \"#if  0\",  in  which\ncase it follows only the last branch). The reason for this is that failing to pursue only one\nbranch can result in ambiguous syntax, as in the following example:\n\n#ifdef TWOALTERNATIVES\nstruct {\n#else\nunion {\n#endif\nshort a;\nlong b;\n}\n\nBoth branches cannot be followed, or braces become unbalanced and ctags would  be  unable  to\nmake sense of the syntax.\n\nIf the application of this heuristic fails to properly parse a file, generally due to compli-\ncated and inconsistent pairing within the conditionals, ctags will retry  the  file  using  a\ndifferent  heuristic which does not selectively follow conditional preprocessor branches, but\ninstead falls back to relying upon a closing brace (\"}\") in column 1 as indicating the end of\na block once any brace imbalance results from following a #if conditional branch.\n\nCtags  will also try to specially handle arguments lists enclosed in double sets of parenthe-\nses in order to accept the following conditional construct:\n\nextern void foo ARGS((int one, char two));\n\nAny name immediately preceding the \"((\" will be automatically ignored and the  previous  name\nwill be used.\n\nC++  operator  definitions  are specially handled. In order for consistency with all types of\noperators (overloaded and conversion), the operator name in the tag file will always be  pre-\nceded  by  the string \"operator \" (i.e. even if the actual operator definition was written as\n\"operator<<\").\n\nAfter creating or appending to the tag file, it is sorted by the tag name, removing identical\ntag lines.\n",
                "subsections": []
            },
            "TAG FILE FORMAT": {
                "content": "When  not running in etags mode, each entry in the tag file consists of a separate line, each\nlooking like this in the most general case:\n\ntagname<TAB>filename<TAB>excmd;\"<TAB>extensionfields\n\nThe fields and separators of these lines are specified as follows:\n\n1.  tag name\n2.  single tab character\n3.  name of the file in which the object associated with the tag is located\n4.  single tab character\n5.  EX command used to locate the tag within the file; generally a search pattern (either\n/pattern/  or  ?pattern?) or line number (see --excmd). Tag file format 2 (see --for-\nmat) extends this EX command under certain circumstances to include a set  of  exten-\nsion  fields  (described below) embedded in an EX comment immediately appended to the\nEX command, which leaves it backward-compatible with original vi(1) implementations.\n\nA few special tags are written into the tag file for internal purposes. These tags  are  com-\nposed  in  such a way that they always sort to the top of the file.  Therefore, the first two\ncharacters of these tags are used a magic number to detect a tag file for purposes of  deter-\nmining whether a valid tag file is being overwritten rather than a source file.\n\nNote that the name of each source file will be recorded in the tag file exactly as it appears\non the command line. Therefore, if the path you specified on the command line was relative to\nthe  current  directory,  then  it will be recorded in that same manner in the tag file. See,\nhowever, the --tag-relative option for how this behavior can be modified.\n\nExtension fields are tab-separated key-value pairs appended to the end of the EX command as a\ncomment,  as  described  above. These key value pairs appear in the general form \"key:value\".\nTheir presence in the lines of the tag file are controlled by the --fields option. The possi-\nble keys and the meaning of their values are as follows:\n\naccess      Indicates  the  visibility  of  this class member, where value is specific to the\nlanguage.\n\nfile        Indicates that the tag has file-limited visibility. This key has no corresponding\nvalue.\n\nkind        Indicates the type, or kind, of tag. Its value is either one of the corresponding\none-letter flags described under the various --<LANG>-kinds options above,  or  a\nfull  name. It is permitted (and is, in fact, the default) for the key portion of\nthis field to be omitted. The optional behaviors are controlled with the --fields\noption.\n\nimplementation\nWhen  present, this indicates a limited implementation (abstract vs. concrete) of\na routine or class, where value is specific to the language (\"virtual\"  or  \"pure\nvirtual\" for C++; \"abstract\" for Java).\n\ninherits    When  present,  value. is a comma-separated list of classes from which this class\nis derived (i.e. inherits from).\n\nsignature   When present, value is a language-dependent representation of the signature of  a\nroutine.  A routine signature in its complete form specifies the return type of a\nroutine and its formal argument list. This extension field is presently supported\nonly for C-based languages and does not include the return type.\n\nIn  addition,  information  on the scope of the tag definition may be available, with the key\nportion equal to some language-dependent construct name and its value the name  declared  for\nthat  construct  in  the  program.  This scope entry indicates the scope in which the tag was\nfound. For example, a tag generated for a C structure member would have a scope looking  like\n\"struct:myStruct\".\n",
                "subsections": []
            },
            "HOW TO USE WITH VI": {
                "content": "Vi  will, by default, expect a tag file by the name \"tags\" in the current directory. Once the\ntag file is built, the following commands exercise the tag indexing feature:\n\nvi -t tag   Start vi and position the cursor at the file and line where \"tag\" is defined.\n\n:ta tag     Find a tag.\n\nCtrl-]      Find the tag under the cursor.\n\nCtrl-T      Return to previous location before jump to tag (not widely implemented).\n",
                "subsections": []
            },
            "HOW TO USE WITH GNU EMACS": {
                "content": "Emacs will, by default, expect a tag file by the name \"TAGS\" in the current  directory.  Once\nthe tag file is built, the following commands exercise the tag indexing feature:\n\nM-x visit-tags-table <RET> FILE <RET>\nSelect the tag file, \"FILE\", to use.\n\nM-. [TAG] <RET>\nFind  the first definition of TAG. The default tag is the identifier under the cur-\nsor.\n\nM-*       Pop back to where you previously invoked \"M-.\".\n\nC-u M-.   Find the next definition for the last tag.\n\nFor more commands, see the Tags topic in the Emacs info document.\n",
                "subsections": []
            },
            "HOW TO USE WITH NEDIT": {
                "content": "NEdit version 5.1 and later can handle the new extended tag file format  (see  --format).  To\nmake  NEdit  use the tag file, select \"File->Load Tags File\". To jump to the definition for a\ntag, highlight the word, then press Ctrl-D. NEdit 5.1 can can read multiple  tag  files  from\ndifferent  directories.   Setting  the X resource nedit.tagFile to the name of a tag file in-\nstructs NEdit to automatically load that tag file at startup time.\n",
                "subsections": []
            },
            "CAVEATS": {
                "content": "Because ctags is neither a preprocessor nor a compiler, use of preprocessor macros  can  fool\nctags  into  either  missing tags or improperly generating inappropriate tags. Although ctags\nhas been designed to handle certain common cases, this is the single  biggest  cause  of  re-\nported  problems.  In  particular, the use of preprocessor constructs which alter the textual\nsyntax of C can fool ctags. You can work around many such problems by using the -I option.\n\nNote that since ctags generates patterns for locating tags (see the --excmd  option),  it  is\nentirely  possible  that  the  wrong line may be found by your editor if there exists another\nsource line which is identical to the line containing the tag. The following  example  demon-\nstrates this condition:\n\nint variable;\n\n/* ... */\nvoid foo(variable)\nint variable;\n{\n/* ... */\n}\n\nDepending  upon  which  editor you use and where in the code you happen to be, it is possible\nthat the search pattern may locate the local parameter declaration in foo() before  it  finds\nthe  actual  global variable definition, since the lines (and therefore their search patterns\nare identical). This can be avoided by use of the --excmd=n option.\n",
                "subsections": []
            },
            "BUGS": {
                "content": "Ctags has more options than ls(1).\n\nWhen parsing a C++ member function definition (e.g. \"className::function\"), ctags cannot  de-\ntermine whether the scope specifier is a class name or a namespace specifier and always lists\nit as a class name in the scope portion of the extension fields. Also, if a C++  function  is\ndefined  outside  of  the  class declaration (the usual case), the access specification (i.e.\npublic, protected, or private) and implementation information (e.g.  virtual,  pure  virtual)\ncontained  in  the function declaration are not known when the tag is generated for the func-\ntion definition. It will, however be available for prototypes (e.g --c++-kinds=+p).\n\nNo qualified tags are generated for language objects inherited into a class.\n",
                "subsections": []
            },
            "ENVIRONMENT VARIABLES": {
                "content": "CTAGS   If this environment variable exists, it will be expected to contain a set of  default\noptions  which  are  read  when ctags starts, after the configuration files listed in\nFILES, below, are read, but before any command line options are read. Options appear-\ning  on  the  command line will override options specified in this variable. Only op-\ntions will be read from this variable. Note that all white space in this variable  is\nconsidered  a  separator, making it impossible to pass an option parameter containing\nan embedded space. If this is a problem, use a configuration file instead.\n\nETAGS   Similar to the CTAGS variable above, this variable, if found, will be read when etags\nstarts. If this variable is not found, etags will try to use CTAGS instead.\n\nTMPDIR  On Unix-like hosts where mkstemp() is available, the value of this variable specifies\nthe directory in which to place temporary files. This can be useful if the size of  a\ntemporary  file  becomes too large to fit on the partition holding the default tempo-\nrary directory defined at compilation time.  ctags creates temporary  files  only  if\neither (1) an emacs-style tag file is being generated, (2) the tag file is being sent\nto standard output, or (3) the program was compiled to use an internal sort algorithm\nto sort the tag files instead of the the sort utility of the operating system. If the\nsort utility of the operating system is being used, it will  generally  observe  this\nvariable also. Note that if ctags is setuid, the value of TMPDIR will be ignored.\n",
                "subsections": []
            },
            "FILES": {
                "content": "/ctags.cnf (on MSDOS, MSWindows only)\n/etc/ctags.conf\n/usr/local/etc/ctags.conf\n$HOME/.ctags\n$HOME/ctags.cnf (on MSDOS, MSWindows only)\n.ctags\nctags.cnf (on MSDOS, MSWindows only)\nIf  any  of these configuration files exist, each will be expected to contain a set of\ndefault options which are read in the order listed when ctags starts, but  before  the\nCTAGS environment variable is read or any command line options are read. This makes it\npossible to set up site-wide, personal or project-level defaults. It  is  possible  to\ncompile  ctags  to  read  an  additional  configuration file before any of those shown\nabove, which will be indicated if the output produced by the  --version  option  lists\nthe  \"custom-conf\"  feature. Options appearing in the CTAGS environment variable or on\nthe command line will override options specified in these files. Only options will  be\nread  from  these  files. Note that the option files are read in line-oriented mode in\nwhich spaces are significant (since shell quoting is not possible). Each line  of  the\nfile  is read as one command line parameter (as if it were quoted with single quotes).\nTherefore, use new lines to indicate separate command-line arguments.\n\ntags   The default tag file created by ctags.\n\nTAGS   The default tag file created by etags.\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "The official Exuberant Ctags web site at:\n\nhttp://ctags.sourceforge.net\n\nAlso ex(1), vi(1), elvis, or, better yet, vim, the official editor of ctags. For more  infor-\nmation on vim, see the VIM Pages web site at:\n\nhttp://www.vim.org/\n",
                "subsections": []
            },
            "AUTHOR": {
                "content": "Darren Hiebert <dhiebert at users.sourceforge.net>\nhttp://DarrenHiebert.com/\n",
                "subsections": []
            },
            "MOTIVATION": {
                "content": "\"Think ye at all times of rendering some service to every member of the human race.\"\n\n\"All effort and exertion put forth by man from the fullness of his heart is worship, if it is\nprompted by the highest motives and the will to do service to humanity.\"\n\n-- From the Baha'i Writings\n",
                "subsections": []
            },
            "CREDITS": {
                "content": "This version of ctags was originally derived from and inspired by the ctags program by  Steve\nKirkendall <kirkenda@cs.pdx.edu> that comes with the Elvis vi clone (though virtually none of\nthe original code remains).\n\nCredit is also due Bram Moolenaar <Bram@vim.org>, the author of vim, who has devoted so  much\nof  his  time and energy both to developing the editor as a service to others, and to helping\nthe orphans of Uganda.\n\nThe section entitled \"HOW TO USE WITH GNU EMACS\" was shamelessly stolen from  the  info  page\nfor GNU etags.\n\nDarren Hiebert                       Version 5.9~svn20110310                             CTAGS(1)",
                "subsections": []
            }
        }
    }
}