EnglishFrenchSpanish

OnWorks favicon

otags - Online in the Cloud

Run otags in OnWorks free hosting provider over Ubuntu Online, Fedora Online, Windows online emulator or MAC OS online emulator

This is the command otags that can be run in the OnWorks free hosting provider using one of our multiple free online workstations such as Ubuntu Online, Fedora Online, Windows online emulator or MAC OS online emulator

PROGRAM:

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.

Use otags online using onworks.net services


Free Servers & Workstations

Download Windows & Linux apps

Linux commands

Ad