Hi
Here is my first attempt (see attachment). It works correctly in the
little testing that I have done (on Windows). Just add
\usemodule[ctags] somewhere in your environment file, and run context.
I file called context.tags will be generated which contains the
labels, filename, and line-number where the label occurs (line number
can sometimes be off).
I modify a few core macros, so this can possibly break existing stuff
(It should not, but then ...)
I found no reliable way to know the current file name. So this works
correctly only if registerfileinfo is called. So one will have the
correct filename when using a project structure, but not when using
\input. I do not want to redefine \input, since almost everything
relies on \input working correctly.
I will also post the module on the garden once I am more comfortable
with it. This one is too dangerous to go to the core.
Aditya
%M \logo [CTAGS] {CTAGS}
%D \module
%D [ file=t-ctags,
%D version=2007-02-26,
%D title=\CONTEXT\ tags(\CTAGS),
%D subtitle=\CTAGS\ support in \CONTEXT,
%D author={Aditya Mahajan},
%D date=\currentdate]
%D
%M \setuphead [section] [page=]
%M \useURL[ctags][http://ctags.sourceforge.net/]
%M \useURL[vim] [http://www.vim.org]
%M \logo [VIM] {VIM}
%M \logo [EMACS] {EMACS}
%D \section Introduction
%D
%D \CTAGS\ is a program that generates an index of language objects
%D found in a file that allows these objects to be easily located by a
%D text editor. They are tightly integrated with \VIM\ and \EMACS. For
%D large \TEX\ files, \CTAGS\ is very useful to find reference labels.
%D Suppose you are writing a long book or paper, and you want to add
%D reference to an equation. Also suppose all your equation labels start
%D with \type{eq:}. Then in \VIM\ you can type \type{eq:} and press
%D \type{^X^]} and \VIM\ will present you with a pop-up menu showing the
%D different labels that start with \type{eq:}. For long files this can
%D save you a lot of time.
%D
%D Traditionally tags are generated from an external program. However,
%D \CONTEXT's syntax is almost impossible to parse from an external
%D program. Consider the following two cases
%D \starttyping
%D \defineenumeration[problem]
%D \startproblem[tag]
%D blah blah
%D \stopproblem
%D \stoptyping
%D and
%D \starttyping
%D \defineitemgroup[problem]
%D \startproblem[intro]
%D \item blah blah
%D \stopproblem
%D \stoptyping
%D
%D For an external program to correctly parse this, it must be able to
%D understand \TEX. The only program that can understand \TEX\ is \TEX.
%D So, I decided to write \CTAGS\ support for \CONTEXT\ in \CONTEXT. It
%D turned out to be much simpler than expected. So now, one can read
%D \CTAGS\ as \CONTEXT\ tags \mono{:-)}.
%D
%D \section User Guide
%D
%D To use the module simply add
%D \starttyping
%D \usemodule[ctags]
%D \stoptyping
%D on the top of the file\footnote{This must be done before
%D \type{\everystarttext} is executed. That is either in the environment
%D file or before \type{\starttext} in a file.}. Unfortunately, right
%D now (that is with \PDFTEX), it is not possible to create a file
%D without extension. So, the tags are written to a file
%D \filename{context.tags}. To use this in \VIM, you have to add
%D \starttyping
%D set tags=./tags,tags,context.tags
%D \stoptyping
%D in your \filename{.vimrc} (\filename{_vimrc} on Windows). I do not
%D know how to do something similar in \EMACS. If someone knows, please
%D let me know.
%D
%D This file modifies a core \CONTEXT\ macro, so be careful while using
%D it. It may (although it should not) break in some cases. You have
%D been warned.
%D
%D The rest of the file is self explanatory.
\writestatus {loading} {Context CTAGS support Module}
\startmodule[vim]
\unprotect
\newwrite\ctagsfile
\newtoks\everyopenctags
\newtoks\everyclosectags
%D TODO: Find out if we are running \LUATEX, and if we are write to
%D \filename{tags}.
\appendtoks
\immediate\openout\ctagsfile context.tags
\immediate\write\ctagsfile{!_TAG_FILE_FORMAT\rawcharacter{9}1}
\immediate\write\ctagsfile{!_TAG_FILE_SORTED\rawcharacter{9}0}
\immediate\write\ctagsfile{!_TAG_PROGRAM_AUTHOR\rawcharacter{9}Aditya Mahajan}
\immediate\write\ctagsfile{!_TAG_PROGRAM_NAME\rawcharacter{9}ConTeXt t-ctags
module}
\to \everyopenctags
\appendtoks
\immediate\closeout\ctagsfile
\to \everyclosectags
\let\normalwriterefernce\writereference
\def\writereference#1% #2#3#4
{\doifsomething{#1}
{\immediate\write\ctagsfile{#1\rawcharacter{9}\currentctagsfile
\rawcharacter{9}\the\inputlineno}}
\normalwriterefernce{#1}}% #2#3#4
%D \type{\everystarttext} is executed at \type{\startcomponent}. If we
%D have a typical structure
%D \starttyping
%D \startcomponent file
%D \product file
%D \enviromnent file
%D \stoptyping
%D then \type{\everystarttext} is executed before ctags module is
%D loaded. So, we open the tags as soon as the module is loaded. This
%D can cause a problem, if for whatever reason, \type{\everygoodbye} is
%D not executed.
\def\openctags{\the\everyopenctags}
\def\closectags{\the\everyclosectags}
% \appendtoks \openctags \to \everystarttext
\appendtoks \closectags \to \everygoodbye
% NOTE: Open the tags file!
\openctags
%D It does not seem possible to get the name of the current file being
%D processed. I tried \type{\inputfilename} and \type{\currentfilename}
%D but \type{\inputfilename} always gives the name of the product file,
%D while \type{\currentfilename} always get the name of the environment
%D file. So, I redefine \type{\registerfileinfo} to keep track of the
%D current file. This will only work if you have a proper project
%D structure, and not work with \type{\input}
\let\normalregisterfileinfo=\registerfileinfo
\def\registerfileinfo[#1#2]#3%
{\doif{#1#2}{begin}
{\splitctagsfilename{#3}
\edef\currentctagsfile{\ctagsfilename.\ctagsfilesuffix}}
\normalregisterfileinfo[#1#2]{#3}}
\def\splitctagsfilename#1
{\edef\ascii{#1}\convertcommand\ascii\to\ascii%
\splitstring\ascii\at.\to\ctagsfilename\and\ctagsfilesuffix%
\lowercasestring\ctagsfilesuffix\to\ctafsfilesuffix%
\doifnothing\ctagsfilename {\let\ctagsfilename \currentctagsfile}%
\doifnothing\ctagsfilesuffix{\let\ctagsfilesuffix\c!tex}}
\def\currentctagsfile{\jobfullname}
\stopmodule
\protect
_______________________________________________
ntg-context mailing list
[email protected]
http://www.ntg.nl/mailman/listinfo/ntg-context