Provided by: otags_4.02.2-1_amd64 bug

NAME

       otags - generate tags files for emacs and vi/vim from OCaml sources

SYNOPSIS

       otags [STATIC-OPTION] ... [FILE] ... [DYNAMIC-OPTION] ... [FILE] ...

DESCRIPTION

       otags  generates  TAGS  files  for  emacs  and tags files for vi/vim to give these editors the ability to
       directly jump to function and value definitions (use M-.  in Emacs and ^] in vi[m] with the cursor on the
       symbol).

       otags uses camlp4 for parsing. This is more  precise  than  regular  expression  based  tagging.  On  the
       downside,  otags  can only tag syntactically correct files. Furthermore, otags is OCaml version specific:
       Sources to be compiled with OCaml version X.Y can, in general, only be tagged with otags version X.Y.

       otags can tag all files that camlp4 can parse. Internally otags keeps a current parser list that  can  be
       modified  with  the options -pc (clear list), -pa (add to list), and -pr (reset to default).  The default
       value of the current parser list corresponds to standard OCaml syntax (containing the parsers  r  and  o,
       see  STANDARD  CAMLP4  PARSING  EXTENSIONS  below).  Each source file is parsed with a camlp4 parser into
       which all parsing extensions from the current parser list have been loaded. The camlp4  standard  parsers
       are  linked  into otags and if the current parser list contains only such parsers then the parsing module
       is build internally. Otherwise an external camlp4 process is started.

       otags tags all toplevel items in structures and signatures, including infix operators and nested  modules
       and  signatures.  It also tags instance variables and methods in classes and class-types.  Filenames FILE
       on the command line are parsed as interfaces if they have a .mli suffix and as  implementations  if  they
       have a .ml suffix. (See also the dynamic options -intf and -impl.)

       otags can tag all files in a directory tree (if option -r is given). Files that are generated by ocamllex
       or  ocamlyacc  or that require preprocessing with the camlp4 macro parser must, however, be tagged in the
       same directory where these tools have been run. This is because the line  directives  that  ocamllex  and
       ocamlyacc  put  into  generated  files  are  relative  to the current working directory of the generating
       process. For the camlp4 macro parser an INCLUDE directive may be resolved relative to the current working
       directory of the camlp4 process. Therefore, if you tag such files from a different directory you will get
       an error message.

       When tagging whole directory trees recursively, one can specify exceptions from the current  parser  list
       in a parser hints file or directory tree, see option -parser-hints and PARSING HINTS FILES below.

       Tag  files  can  contain absolute and/or relative file names.  Otags uses the file names from the command
       line for the tags file.  Specifying relative file names on the command line will therefore give you a tag
       file with relative file names. Obviously, a tag file with relative file names will only  work  if  it  is
       located  in the directory where otags was started.  Otags supports writing a tags file with relative file
       names in a parent directory via option -add-path, see EXAMPLES below.

STATIC OPTIONS

       Static options take effect on the whole program run, regardless of their position in the command line.

       -r     Descend into directories. With this option, if one of the FILE arguments is a directory otags will
              recursively tag all files in this whole directory tree.

       -o file
              Write tags to file.  The default is TAGS (for emacs) and tags for vi (if the -vi option is  given)
              in the current directory. If file is a dash ( - ) the tags are written to standard output.

       -a     Append to an existing TAGS file (does only work for emacs TAGS files).

       -vi    Generate tags for vi and change the default output file into tags.

       -I dir Add directory dir to the camlp4 search path for object files for external camlp4 parsing calls.

       -add-path path
              Add  path  at the front of every relative file name in the tags file.  Useful when you want to put
              the tags file in a parent directory.

       -parser-hints file
              Apply the parser hints in the specified file or directory tree. Whenever otags tags  a  file  that
              appears  in a parser hints file, it uses the parsers specified there instead of the current parser
              list, see PARSING HINTS FILES below. This option can be given multiple times  to  process  several
              hints  files.  If  file  is  a directory then all files in that tree are processed as parser hints
              files.

       -version
              Print version and exit.

       -v     Verbose. Print file names as they are parsed and the command lines for externally  started  camlp4
              parsing processes (if any). If -v is the first command line argument backtraces for exceptions are
              enabled  and  printed  if  an exception escapes and terminates otags (which is considered as a bug
              about which I would appreciate a bug report).

       -q     Be quiet.

       -help  Print the option list.

       --help Alias for -help

DYNAMIC OPTIONS

       Dynamic options do only affect arguments that follow them on the command line.

       -intf FILE
              Parse and tag FILE as an interface.

       -impl FILE
              Parse and tag FILE as implementation.

       -pc    Clear the current parser list.

       -pa parser
              Add parser to the current parser list.  If parser is not one of  the  standard  parsers  that  are
              distributed  with  camlp4  then  the  following file(s) are parsed in separate camlp4 process(es).
              parser must be accepted by camlp4 -parser, that is, it must be a standard camlp4 parser name or  a
              bytecode file (.cmo) or library (.cma).

       -pr    Reset the current parser list to its default value (parse standard OCaml without extensions).

       -pp    Print the current parser list.

       -extern
              Force otags to parse all the following files with an external camlp4 process.

       -intern
              Switch back to (default) internal parsing.

PARSING HINTS FILES

       Parsing  hints  files  are  simple text files that specify parsers for certain files. This is useful when
       tagging recursively with option -r.  Here is an example for some files from the OCaml distribution:

           oq:
                camlp4/examples/parse_files.ml
           o rq g:
                camlp4/examples/macros.ml
                camlp4/examples/arith.ml
           rf debug:
                camlp4/Camlp4Bin.ml
                camlp4/mkcamlp4.ml
                camlp4/camlp4prof.ml
                camlp4/camlp4prof.mli

       The format of parser hints files is as follows. Empty lines and lines starting with ``#'' are ignored.  A
       parser  hints  file  consists  of  an  arbitrary  number  of  sections.  Each section starts with a colon
       terminated line that specifies the parser to use with a space separated list of parser names (like  those
       accepted  by  option  -pa).  The remainder of the section contains file names, one per line.  Leading and
       trailing white space is ignored.

EXAMPLES

       Tag some files in the original and some in the revised syntax:

              otags original.ml -pc -pa r revised.ml -pr original.ml

       The -pc is necessary because, for camlp4, the original OCaml  syntax  is  an  extension  of  the  revised
       syntax.  Therefore,  the default current parser list contains the parser r already and adding r would not
       change the current parser list.

       Tag files with quotations (original host syntax and revised quotation syntax):

              otags -pa rq qotation.ml

       Tag files that use the sexplib extension:

              otags   -I   /usr/lib/ocaml/type-conv   -I   /usr/lib/ocaml/sexplib   -pa   pa_type_conv.cmo   -pa
              pa_sexp_conv.cmo use_sexp.ml

       The  -I  options  specify  the directories where pa_type_conv.cmo and pa_sexp_conv.cmo are located on the
       system.

       Tag files in a subdirectory keeping the tags file in parent directory

              cd subdir; otags -o ../TAGS -add-path subdir ...

       This complicated procedure is only necessary if there  are  files  inside  subdir  with  line  directives
       containing  relative  file names (for instance, generated by ocamllex or ocamlyacc running inside subdir)
       and when there are other sudirectories whose material should be added to ../TAGS.  If there are no  files
       with relative line directives one can simply use "otags -r" in the directory containing subdir.  If there
       are no other subdirectories one could put the tags file into subdir without using -o or -add-path.

STANDARD CAMLP4 PARSING EXTENSIONS

       There  is  currently  no  documentation  on  the  names and aliases that refer to standard camlp4 parsing
       modules. Also the  dependencies  among  those  modules  is  mostly  undocumented.  The  only  source  for
       information is the file camlp4/Camlp4Bin.ml in the OCaml distribution.

       The  following  list describes the identifiers that camlp4 -parser treats specifically. This is therefore
       the list of standard camlp4 parsers. For these identifiers  case  is  not  significant  (they  are  piped
       through  String.lowercase  before  matching).  The dependencies listed here are treated auto-magically by
       camlp4 and otags.

       r, ocamlr, ocamlrevised, pa_r.cmo, camlp4ocamlrevisedparser.cmo
              Revised syntax without stream parsers.

       rr, reloaded, ocamlreloaded, camlp4ocamlreloadedparser.cmo
              Variant of the revised syntax (usage unknown).

       o, ocaml, pa_o.cmo, camlp4ocamlparser.cmo
              Original syntax without stream parsers. Depends on parser r.

       rp, rparser, pa_rp.cmo, camlp4ocamlrevisedparserparser.cmo
              Revised syntax with stream parsers. (See bug #5134 for OCaml  3.12.0  and  earlier.)   Depends  on
              parser r.

       op, parser, pa_op.cmo, camlp4ocamlparserparser.cmo
              Original syntax with stream parsers. Depends on parser r, o, rp

       g, grammar, pa_extend.cmo, pa_extend_m.cmo, camlp4grammarparser.cmo
              Grammar extensions.

       m, macro, pa_macro.cmo, camlp4macroparser.cmo
              Macros and conditionals.

       q, camlp4quotationexpander.cmo
              Reflective  Quotations.  This  parsing  extension takes the current host syntax and adds quotation
              expanders using that current syntax such that the resulting grammar is  reflective:  Changing  the
              host   syntax   afterwards   does   also   affect   the   quotation  syntax.   Depends  on  module
              Camlp4QuotationCommon (common quotation infrastructure).

       rq, q_mlast.cmo, camlp4ocamlrevisedquotationexpander.cmo
              Revised Quotations. Adds quotations in the revised  syntax.  Host  and  quotation  parsing  remain
              independent. Depends on module Camlp4QuotationCommon (common quotation infrastructure).

       oq, camlp4ocamloriginalquotationexpander.cmo
              Original  OCaml  with  original  quotations. Loads original OCaml (without stream parsers) as host
              syntax and as quotation syntax.  Host and  quotation  syntax  are  independent  (not  reflective).
              Depends on parser ocamlr, ocaml and module Camlp4QuotationCommon

       rf     Full  revised. Sets up revised syntax with stream parsers, grammar extensions, list comprehensions
              and   macros   and   adds   reflective   quotations.   Depends   on   parsers/modules    r,    rp,
              Camlp4QuotationCommon, q, g, comp, m.

       of     Original full. Sets up original OCaml with stream parsers, grammar extensions, list comprehensions
              and  macros  and  adds  reflective quotations (i.e., quotations are in original syntax).  (See bug
              #5129  for  OCaml  3.12.0  and   earlier.)    Depends   on   parsers/modules   r,   o,   rp,   op,
              Camlp4QuotationCommon, q, g, comp and m.

       comp, camlp4listcomprehension.cmo
              List comprehensions.

       debug, camlp4debugparser, camlp4debugparser.cmo
              Debugging  statements  debug  and  camlp4_debug.  The expansion of those statements depends on the
              value of the environment variable STATIC_CAMLP4_DEBUG such that  also  the  produced  tag  entries
              might depend on this variable.

DIAGNOSTICS

       Parse errors are reported with normal camlp4 error messages. No tags are generated for files that produce
       errors. Tagging continues with the next file, in this case.

       The error "Original source not available" is reported if the file to which a line directive refers cannot
       be  found.  This  may happen if otags is started in a different directory than the program that generated
       the faulting file.

       Otags exists with "Parser list empty for ..." when attempting to process a file  with  an  empty  current
       parser list.  This happens when no -pa option follows -pc.

       Otags  prints  "Toplevel directive found in ... Skip file." for files containing toplevel directives. The
       problem is that the location information  in  the  abstract  syntax  tree  is  incorrect  after  toplevel
       directives, see bug #5127.

       Escaping exceptions and assertions that terminate otags are considered as bugs. If they occur, please use
       option -v as first command line switch to obtain an exception backtrace and submit this with all relevant
       information as bug report.

EXIT STATUS

       0      everything went OK

       1      a parse error or some other error occurred and otags skipped the affected file

       2      a fatal error caused otags to abort

       3      some bug caused a crash, from which otags could only marginally recover

KNOWN PROBLEMS

       The  camlp4  and  OCaml  parsers  differed  always  in  subtle  ways.  Making camlp4 independent of OCaml
       aggravated the problem.  camlp4 version 4.02.3 only accepts very few attributes. It accepts no  block  or
       stand  alone attributes (those with [@@ and [@@@) or extension nodes ( [% or [%%).  Otags therefore fails
       on many fails from the OCaml standard library.

MISSING FEATURES

       Appending to vi tags files requires to reread the existing tags file, because vi tags files are sorted.

       Incompatible camlp4 syntax trees (from  external  camlp4  parsing  processes)  are  detected  with  magic
       numbers.  However, an incompatible camlp4 will likely die when it tries to load the otags specific camlp4
       printer. Such fatal dynamic loader errors are treated like parsing errors, because  camlp4  produces  the
       same exit status in both cases.

CREDITS

       Cuihtlauac  Alvarado  and  Jean-Francois  Monin were the first to exploit camlp4 for tagging OCaml files.
       This version is a complete rewrite, based on the new camlp4 from OCaml version 3.10 and onwards.

AUTHOR

       Hendrik Tews <otags at askra.de>

SEE ALSO

       etags(1), ctags(1)

OTAGS                                              August 2010                                          OTAGS(1)