ctags

ctags is a tool that scans source code and produces an index, called a tag file, of the language objects defined in it, such as functions, classes, variables, and macros. The Universal Ctags documentation states that this index “makes it easy for text editors and other tools to locate the indexed items.” Each tag records a name, the file it lives in, and how to find the definition, so an editor can offer “jump to definition” by looking the symbol up in the tag file rather than searching the whole project.

The concept dates to early Unix, where a ctags utility generated a tags file consumed by the vi editor’s tag-following commands. This established a simple, durable contract: a separate indexing pass writes a portable tags file, and any editor that understands the format can navigate by it. The format’s simplicity is part of why it endured across decades and editors, from vi and Vim to Emacs and many IDEs.

Exuberant Ctags, maintained by Darren Hiebert, became the dominant successor. As the Universal Ctags repository notes, Exuberant Ctags improved traditional ctags with multi-language support, the ability for users to define new languages searched by regular expressions, and the ability to generate Emacs-style TAGS files. This made one tool serve dozens of languages and made it extensible to new ones without modifying its source.

Development of Exuberant Ctags eventually stalled. Universal Ctags arose to continue the work: the project describes itself as starting when Reza Jelveh created a personal GitHub fork, after which contributors decided to move development to a dedicated project. Its stated goal is to maintain and improve ctags through collaborative community effort, adding a greater number of supported languages, better language support, a fully extended optlib for user-defined languages, and an experimental interactive mode, while documenting incompatibilities for users migrating from Exuberant Ctags.

ctags occupies an important place in the history of code navigation. It demonstrated that a lightweight, language-agnostic index of definitions, decoupled from any single editor, could provide go-to-definition long before integrated semantic engines and protocols like LSP existed. Even today the tags approach remains widely used, especially in lightweight or terminal-based workflows where a fast precomputed index is preferable to running a full language server.

Sources

Last verified June 8, 2026