9.2. Emacs `TAGS' for Haskell: hstags

`Tags' is a facility for indexing the definitions of programming-language things in a multi-file program, and then using that index to jump around among these definitions.

Rather than scratch your head, saying “Now where did we define `foo'?”, you just do (in Emacs) M-. foo RET, and You're There! Some people go wild over this stuff…

GHC comes with a program hstags, which build Emacs-able TAGS files. The invocation syntax is:
hstags [GHC-options] file [files...]

The best thing is just to feed it your GHC command-line flags. A good Makefile entry might be:
tags:
        $(RM) TAGS
        hstags $(GHC_FLAGS) *.lhs

The only flags of its own are: -v to be verbose; -a to APPEND to the TAGS file, rather than write to it.

Shortcomings: (1) Instance declarations don't get into the TAGS file (but the definitions inside them do); as instances aren't named, this is probably just as well. (2) Data-constructor definitions don't get in. Go for the corresponding type constructor instead.

(Actually, GHC also comes with etags [for C], and perltags [for You Know What]. And—I cannot tell a lie—there is Denis Howe's fptags [for Haskell, etc.] in the ghc/CONTRIB section…)