When there is no language-specific support, you can use tags. This is a generic completion mechanism.
Generate a TAGS
file, which contains a list of identifiers and where they are defined. Emacs comes with the etags
program to do this in many languages, but not Haskell; ghc comes with hasktags
.
Load the TAGS
file with M-x visit-tags-table
.
Tags are not context-independent, so they'll indiscriminately suggest types, values, constructors, etc everywhere. They also won't provide advanced features such as easily showing the type of a value. The most important tags commands are:
M-TAB
(complete-symbol
) completes an identifier according to the loaded list of tags.
M-.
(find-tag
) goes to the place where the identifier at point is defined, opening the containg file if necessary.
M-*
(pop-tag-mark
) goes back where you were before M-.
.
M-x tags-apropos
shows a list of identifiers matching a regexp.
For more information, look under "Tags" in the Emacs manual.
For an even cruder, but fully automatic mechanism, there is the dynamic abbrev feature. C-M-/
(dabbrev-completion
) looks in most open buffers for a completion; this is completely language-independent, so it'll even find words in strings, comments, whatever. M-/
(dabbrev-expand
) is similar, but directly completes to the nearest match before point.