# [NTG-context] ctags and ConTeXt

Mon Feb 12 05:55:12 CET 2007

Hi,

I am wondering how others manage a large list of reference labels in
ConTeXt. I use Vim as an editor and it supports ctags. ctags is a
utility that is basically for supporting tags in programs (initially
only for C, and hence the name), but can be used relatively easily
with LaTeX. Basically, ctags creates a tag file with the format

<tag-name> <tag-file> <tag-regex>

(for details see http://ctags.sourceforge.net/FORMAT)

Suppose I have a bunch of references all starting from eq:. Then
inside Vim, I can type eq: and  press ^X^T for Vim to search for the
tags file with everything starting with eq: and I get to see all of
them in a pop up menu. I can choose which ever label I want and
continue. Further I can press ^] on a tag, and Vim jumps to the
location of the tag, something like a hyperlink within the editor. I
find both these features very useful while working for files with more
than 50 tags.

Creating a tag file for LaTeX is easy, since in LaTeX all labels are
created using \label{....}. So, you can instruct ctags (the program)
to search the file for \label{...} and store the first argument to the
tags file.

However, taking this approach with ConTeXt is almost impossible.
Since the label is tied to the environment that creates it, it is
impossible to parse. There is no way a reg-ex can determine if mylabel
in \startproblem[mylabel] is an optional argument or a label. So, the
only way to really get the label is through TeX itself. The tui file
has some information, but it can be very hard to parse. A typical tui
file has enteries like

c
c \mainreference{}{fnt:f:2}{2--0-2-4-1-0-0-0--8}{10}{}
c
\mainreference{}{sec:prelim}{2--0-2-4-1-0-0-0--8}{10}{{C.4.1}{Preliminaries}}

where the first two are auto-generated, while I only want the user
entered tags to be stored. Suppose, one is willing to have the extra
overhead of parsing every mainreference in the tag file. I can get the
first two pieces of information for the tag file, the name of the tag
and the file that it is in. But how do I get a regex (or linenumber)
of where the tag is located in the file, so that ^] takes me to that
tag. I can not figure out a regex which will take care of every case.

Is there some other way to proceed? What are those other numbers in
\mainreferece, do they contain any information about the line in the
source file that generated the tag. And more generally, what do others
do to keep track of labels in large projects.