'Source code reading' related sites
Comparison of source code reading tools
- Tags and LSPs where do I start?
With the introduction of the Language Server Protocol (referenced as LSP from here on in),
there’s increasing confusion over what they offer and if people still need tags.
- GNU Global benchmarks
Since I just ran some cscope benchmarks, I thought it'd be interesting
to run the exact same tests with GNU global. Here I use the gtags-cscope frontend.
- Gtags vs Ctags
We compared ctags vs gtags - see result.
- 'Comparison with Similar Tools' in the OpenGrok project site
This comparison table compares the function of LXR, ctags, cscope, ViewVC, OpenGrok and, Global
which are typical tools for source code reading.
- ctags < cscope < gtags
2 month ago, I thought ctags was totally enough for navigating through c codes.
However, problems with ctags ...
- Code Spelunking: Exploring Cavernous Code Bases
Code diving through unfamiliar source bases is something we do far more often than
write new code from scratch--make sure you have the right gear for the job. (by George V. Neville-Neil)
- Greg's source code navigation tools
This page is a log of an investigation he made of source code navigation and analysis packages.
- Navigating Linux Source Code
With legacy code or large projects, navigation is a serious concern. Here are some tools that can help you find your way.
(by James Bonang)
Global related articles
- [youtube] Improve project workflow with GNU Global! (Emacs)
For this video I demo a little bit about GNU Global which has been the better tool
in my experience for navigating symbols inside of emacs.
- Using GNU Global with PostgreSQL
When you are coding in a source tree as big as PostgreSQL, you will at some point want to look into some kind of source code indexing.
- EmacsWiki: Gnu Global
The GNU Global package is highly recommended for using a single tags file,
covering all files in all subdirectories, that lives at the base of a source-code tree.
- Using GNU Global with C++ and Git
GNU global is a very compelling way to quickly search your project
for function definitions. Here I show how to index your code and update
it automatically when using git.
- C/C++ Development Environment for Emacs
This guide will help you to setup an efficient working C/C++ environment.
It includes introduction of ggtags and helm-gtags.
- GNU Global in wikipedia
This is a description page of GNU Global in wikipedia.
- How to read other people's code.
Grep shortcomings, the program intend to read other people's code,
you can consider the use like gtags to this tool. gtags GNU Global
source code tag system. (by Chien-Hsing Wang)
- Code Browsing with Emacs, Global, and Speedbar
This article details a simpler solution, using Emacs in combination with Global and Speedbar
for code browsing.
- GNU Global, THE PROGRAMMER'S FRIEND
The reason I shifted to gtags is because ctags is no longer sufficient to me.
I have to trace the codes from large volume than last time, and they scatter
into many different folders.
- Source Code Navigation with VIM
In any case, after trying all the above tools (comment: other tag systems), I settled on gnu global,
although it took some work to get it working with VIM and my setup.
That's what this post is really about: documenting my usage of VIM and gnu global.
Global related tools
In addition to these, there are many forks and related tools of Global in Github. Please see also
Projects which include 'GNU Global' in its title.
Another Emacs frontend to GNU Global. It support wgrep in agtags-grep-mode.
Gutentags is a vim 8 dedicated plugin which will update gtags database in background
automatically on file change.
- Gtags for Gedit
GtagJump is a plug-in for gedit. It also can use etags, python-jedi and python-symtable.
GNU Global(gtags) support for Atom Editor.
GNU Global compatible source code tagging for golang.
Async plugin for Vim/NeoVim to ease the use of ctags/gtags. It is used for generate
and maintain tags for you with multiple platform support, tested on Windows/Linux/macOS.
gen_tags.vim will detect SCM(git, hg, svn) root and use it as the project root path.
Generate/Update ctags and gtags will run in background.
GNU Global interface of ivy.
A pretty simple effective backend for Emacs 25 xref library, using GNU Global.
This Notepad++ plugin is simply a front-end to GNU Global.
- Atom Gtags package
Gtags for Atom. This package uses GNU Global
bundler-gtags command creates gtags for all bundled gems.
And also manages direnv settings exporting GTAGSLIBPATH
so that editors can tag-jump directly to any gems source code
from the bundler application.
- C/C++ Intellisense with the help of GNU Global tags.
Provide Intellisense for C/C++ with the help of the GNU Global tool
in Visual Studio Code.
alt-gtags.vim is a plugin that enables you to use GNU Global (gtags) in a Vim.
if_pyth is required as it is written in Python.
unite-gtags is a unite.vim's source. Execute 'global' command and display
the result in Unite interface.
This package is part of GNU ELPA.
The goal is to make working with GNU Global in Emacs as effortless
and intuitively as possible.
Ajoke is a tool for doing Java programming on Emacs.
It is inspired by Emacs-Eclim, but does not depend on Eclipse.
Instead, it uses GNU Global and ctags-exuberant extensively, with a bunch of Perl scripts.
Sanaly is a Source code ANALYsis web front end for GNU Global. It can treat
source files written in python(.py), shell(.sh), perl(.pl) and ruby(.rb).
- Vim's IDE Mode
Videm (Vim's IDE Mode) is a C/C++ IDE based on vim (will become a common IDE
framework in future, I think). Videm use Cscope and GNU Global as symbol database.
- Drush utilities for Emacs users
Currently the project provides two new Drush commands:
They will run etags/gtags in your DRUPAL_ROOT and generate tag files for use in Emacs
and it will help keep them up to date.
Multi windows tag stacked code browsing with global(gtag).
helm-gtags.el is GNU Global helm interface.
helm-gtags.el is not compatible anything-gtags.el. But helm-gtags.el is designed
for faster search than anything-gtags.el. Now it suppors TRAMP.
A pyQt GUI front-end for cscope, idutils and gtags.
Written in python using pyQt, QScintilla libraries.
Notepad++ is a free source code editor and Notepad replacement that supports
several languages. You can use Global using its GtagsPlugin.
jEdit is a mature programmer's text editor with hundreds (counting the time
developing plug-ins) of person-years of development behind it.
provides an interface to the GNU Global source tagging tool.
Auto Complete Mode is the most intelligent auto-completion extension for GNU Emacs.
You can use this mode with Global.
- GNU cflow
GNU cflow analyzes a collection of C source files and prints a graph,
charting control flow within the program. You can include this output
in your htags hypertext using '--cflow=(cflow's output)'.
- OCaml Global Tagger
A plug-in for GNU Global which tags OCaml source code, using CamlP4 for versions
3.10 of OCaml and above. Provides ocaml_tags, which creates tags for ml and mli
files, and an ogtags script that wraps a gtags call with the ocaml_tags plug-in.
CEDET is a Collection of Emacs Development Environment Tools written with the end goal of
creating an advanced development environment in Emacs.
The Symbol References tool in CEDET can use GNU Global as an external tool.
`anything-gtags-select' is `anything' interface of `gtags-find-tag'.
`anything-c-source-gtags-select' is a source for `gtags-find-tag'.
Replace *GTAGS SELECT* buffer with `anything' interface.
Xgtags.el provides an interface to the Global cross-referencing tools.
While gtags.el, that comes with the Global distribution, is more a
replacement for emacs' own find-tag/pop-tag-mark facility with some
extra stuff, xgtags.el tries to permit the same functionality as
gtags.el, but behaves more like xcscope.el, the emacs interface for
- Doxygen Release 1.4.3 or higher
Doxygen is a documentation system for C++, Java, IDL and C.
Doxygen Release 1.4.3 includes new configuration option USE_HTAGS.
When enabled in combination with SOURCE_BROWSER=YES,
the source browser of htags(1) is used instead of doxygen's own.
This facility needs GLOBAL-4.8.6 or the later.
Glimmer is a simple code editor for use with just about any
programming language, written by Chris Phelps.
It supports Global by Global.py script.
- Vim editor
Vim is a vi clone written by Bram Moolenaar. You can use Global
from this editor using gtags.vim (and|or) gtags-cscope.vim script.
- Elvis editor
Elvis is a vi clone written by Steve Kirkendall,
which has two variables "tagprg" and "tagprgonce" for running
an external tag search program. You can use them with Global.
Emacs is the extensible, customizable, self-documenting real-time
display editor, written by Richard Stallman.
You can use this program as a front end of Global using gtags.el
which is part of the Global package.
Less is a popular file viewer written by Mark Nudelman.
In less-370 or the later, you can use Global from this tool.
- ID utilities
ID utilities is a very powerful token tag system for generic text file.
Its index file is very small and searching is very fast.
You can call this command from global(1).
Bash is the shell, or command language interpreter,
that will appear in the GNU operating system.
You can use bash as a special shell for Global by Globash which
is included in Global package.
Automake is a tool for automatically generating `Makefile.in'
files compliant with the GNU Coding Standards. Automake supports
Global by its GTAGS target.
- FreeBSD build system
FreeBSD adopted Global as the standard source code tag system in its
Plug-in parsers for Global
- Pygments Plug-in Parser for GNU Global
This software is a plug-in parser for GNU Global.
Uses Pygments, which is a syntax highlighter written in Python,
to extract tags. Supports wide variety of programming languages
thanks to Pygments.
cmonster is a Python wrapper for the Clang C++ parser.
JFlex is a lexical analyzer generator for Java, written in Java.
It is also a rewrite of the very useful tool. JLex which was developed
by Elliot Berk at Princeton University.
Clang is a compiler front end for the C, C++, Objective-C, and Objective-C++ programming languages.
It includes a single unified parser for the language above.
Semantic is an infrastructure for parser based text analysis in Emacs.
It is a lexer, parser-generator, and parser. It is written in Emacs Lisp
and is customized to the way Emacs thinks about language files,
and is optimized to use Emacs' parsing capabilities.
LangScan is a library to parse various languages.
It is also part of Gonzui source code search engine.
GCC-XML is a C++ parser, the C++ front-end to GCC, which is
currently able to deal with the language in its entirety.
This is a parser library aimed at developers of free IDEs.
SourceBase aims to make parsing based features easy to implement.
These include intellisense code completion, producing call graphs
and dependency trees, etc.
Dumb Jump is an Emacs "jump to definition" package with support for 40+ programming
languages that favors "just working". This means minimal -- and ideally zero --
configuration with absolutely no stored indexes (TAGS) or persistent
Cquery is a highly-scalable, low-latency language server for C/C++/Objective-C.
It is tested and designed for large code bases like Chromium.
cquery provides accurate and fast semantic analysis without interrupting workflow.
Clangd understands your C++ code and adds smart features to your editor:
code completion, compile errors, go-to-definition and more.
clangd is a language server that implements the Language Server Protocol;
it can work with many editors through a plugin.
clangd is based on the Clang C++ compiler, and is part of the LLVM project.
clang-tags is a C / C++ source code indexing tool. Unlike many other indexing tools,
clang-tags relies on the clang compiler (via the libclang interface) to analyse and
index the source code base.
The Language Server protocol is used between a tool (the client) and a language
smartness provider (the server) to integrate features like auto complete,
go to definition, find all references and alike into the tool.
Lctags is a source code tagging system using libclang to replace gtags(1).
It can take advantage of compiler level information of clang.
An enhanced php ctags index file generator compatible with
http://ctags.sourceforge.net/FORMAT. Using PHP_Parser as PHP syntax parsing backend,
written in pure PHP. The generated ctags index file contains scope and access
information about class's methods and properties.
- Universal Ctags
The goal of the project is preparing and maintaining common/unified working space where
people interested in making ctags better can work together.
Hothasktags generates ctags files for Haskell, with knowledge of import
lists and qualified imports. It provides a smart go-to-definition for Vim,
that almost always gets it right in the presence of multiple names from different modules.
Generate tag file for C++ source code using clang and python.
Cxxtags is a tool to tag(index) C/C++ source files based on clang.
The major difference from ctags is C++ support. C++ syntax
(ex. class, namespace, template, etc.) is supported(not fully yet though).
And generated tag file is a sqlite3 database file.
So you can access tag information via sqlite3 queries.
RTags is a client/server application that indexes c/c++ code and keeps a persistent
in-memory database of references, declarations, definitions, symbolnames etc.
It allows you to find symbols by name (including class and namespace scope).
Most importantly we give you proper follow-symbol and find-references support.
Its interface and output are essentially identical to Universal Ctags.
- Exuberant Ctags
Exuberant Ctags is a reimplementation of the ctags(1), written by Darren Hiebert.
It is very robust in parsing code and supports many languages and many environments.
Universal Ctags took this over already.
JTags is a ctags like program for Java language,
written by Claudio Fleiner.
You can create a TAGS file by calling the etags program that comes as a part of the Emacs
distribution. Usually, etags is compiled and installed when Emacs is built.
Tools similar to grep
Code Search is a tool for indexing and then performing regular expression searches
over large bodies of source code. It is a set of command-line programs written in Go.
Pcregrep looks like it's just a regular grep, but with a PCRE regex engine.
Paragrep is a text search tool that operates at the paragraph level.
Cgrep is a grep tool suitable for searching in large code repositories.
It supports 30 programming languages and searches that go beyond the simple
pattern matching. It enables context-aware filtering and semantic searches
through wildcard and combinators.
Grab is another faster grep alternative that tries to use multiple cores.
It also uses parallel processing, mmap and other speedy tricks behind the scenes.
Greple is a search tools that lets you search for multiple keywords at a time.
Kaki is inspired by ack, and built on top of nodejs.
Beagrep can grep readlink in Android source code in 0.8 0.231 second when cache is hot,
and about 11 seconds when cache is cold.
Ripgrep is a line-oriented search tool that recursively searches your current directory
for a regex pattern while respecting your gitignore rules. ripgrep has first class
support on Windows, macOS and Linux, with binary downloads available for every release.
ripgrep is similar to other popular search tools like The Silver Searcher, ack and grep.
- The Silver Searcher - ag
An attempt to make something better than ack, which itself is better than grep.
It searches through code about 3x-5x faster than Ack.
A grep program configured the way the author like it, he wrote grin to help himself
search directories full of source code. It is written in Python by Robert Kern.
A replacement for (or supplement to) the grep family, glark offers: Perl compatible
regular expressions, highlighting of matches, context around matches,
complex expressions (``and'' and ``or''), and automatic exclusion of non-text files.
Ack is a tool like grep, optimized for programmers.
Designed for programmers with large heterogeneous trees of source code,
ack is written purely in portable Perl 5 and takes advantage of the power of
Perl's regular expressions.
Rak is a grep replacement in pure Ruby. It accepts Ruby syntax regular
expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/
and more things you don't care about. It is based on the Perl tool ack by Andy Lester.
- GNU grep
The grep command searches one or more input files for lines containing
a match to a specified pattern. By default, grep prints the matching lines.
- GNU Global
The -g command of global(1) is also one of grep like tools.
- Hierarchical search
- Ignoring binary files and dot files automatically.
- Ignoring specified files by two method (File list, Skip list).
- POSIX 1003.2 regular expressions (Basic/Extended)
- High performance literal search.
- Change of search range (whole project, current directory, source files, text files)
- Integration with idutils (index search for tokens)
- Client/Server (TRAMP ready)
Code::Blocks is a free C++ IDE built to meet the most demanding needs of its users.
It is designed to be very extensible and fully configurable.
CodeLite is an open-source, cross platform IDE for the C/C++ programming
languages (build and tested on Windows XP SP3, Windows Vista, Windows 7,
Ubuntu 10.04, and Mac OSX 10.5.8).
- VCF Builder IDE
The VCF Builder is an advanced development tool for creating C++ applications,
and supporting a wide number of plug-ins for enhancing it's functionality.
NetBeans refers to both a platform framework for Java desktop applications,
and an integrated development environment (IDE) for developing with Java,
Eclipse is a multi-language software development environment
comprising an integrated development environment (IDE) and
an extensible plug-in system.
Source code browsing Tools
Please see also Global related tools section.
- Code Insight
Code Insight is a Open source, cross platform software for developers to browse,
edit and understand code easily.
Sourcetrail uses static analysis to provide code search and dependency
visualization that lets you understand, refactor and maintain unfamiliar
Hound provides a centralized web front-end to a regex-searchable text index of
multiple Git repositories. It was created by engineers at Etsy to handle searching
CodeDeopt is a source code search engine which supports Java, C, C++, C#, VB.NET, SQL.
- The Elixir Cross Referencer
Elixir is a source code cross-referencer inspired by LXR. It's written
in Python and its main purpose is to index every release of the Linux kernel
while keeping a minimal footprint.
It is intended to be used with a code editor plugin to enhance
DXR is a source code cross-reference tool that uses static analysis
data collected by instrumented compilers.
- Go Oracle
A new tool built atop the static analysis libraries under construction
in the go.tools repository. The oracle is designed to answer, quickly
and precisely, a range of questions about your Go program, such as
"where can this dynamic call dispatch to?" or "who sends values on this channel?".
Erlcscope builds a cscope compatible database for erlang files.
The database can be used with any program which supports cscope
along with the standard cscope -d command.
- Woboq Code Browser
The Woboq Code Browser is a web-based code browser for C/C++ projects.
SourceWeb is a C/C++ code indexer and a code navigator GUI.
The indexer uses Clang's libraries to parse translation units.
The output is a binary index file, optimized for fast creation, fast lookup,
and small size.
A code-understanding, code-browsing or code-search tool.
This is a tool to index, then query or search C, C++,
Java and Python source code. It builds upon the databases of cscope and ctags,
and provides a nice GUI tool.
Source code search engine based upon OpenGrok.
It provide simplified interface to search large scale source code tree.
SrcExpl (Source Explorer) is a source code explorer that provides context
for the currently selected keyword by displaying the function or type definition or
declaration in a separate window. This plugin aims to recreate the context window
available in the IDE known as "Source Insight".
- Code Search
Code Search is a tool for indexing and then performing regular expression
searches over large bodies of source code.
It is a set of command-line programs written in Go.
Binary downloads are available for those who do not have Go installed.
It is line-oriented source code search engine and search app.
It is possible to find the line containing the desired keyword
from the order of several tens of thousands of files instantly.
This project provides the ability to generate call graphs to aid the task
of understanding code. It uses a highly modular set of collection methods
and can be adapted to support any language although only C and C++ are
currently supported. Each collection method has different advantages
- Silent Bob
The SilentBob is yet another indexing tool helping you to find your way through
the software source code. Although SilentBob is also able to index sources in
many popular programming languages, currently C/C++ is the most functional back-end.
OpenGrok is a fast and usable source code search and
cross reference engine. It helps you search, cross-reference and
navigate your source tree. It can understand various program file
formats and version control histories like SCCS, RCS, CVS and
Subversion. It is written in Java.
Gonzui is a source code search engine for accelerating open source
software development. You can use this tool for your local source code.
PHPXref is a developer tool that's designed to ease the process
of working on large PHP projects by making it very fast and
easy to browse the code documentation along with the code itself.
ncc is a compiler that produces program analysis information.
ncc is a decent replacement of cflow and cscope able to analyse
any program using the gcc compiler.
A general purpose source code indexer and cross-referencer that
provides web-based browsing of source code with links to the
definition and usage of any identifier. Supports multiple languages.
TagSearch is a command line tool for searching Tags in Exuberant
ctags Files. - Search for special tag kind (classes, variable
definitions ...) - configurable output format - search case
sensitive/insensitive - search for partial or full Match.
Freescope is a programmer tool that provides source code browsing on
UNIX-like operating systems. It is a clone of the cscope program
but has its own unique features such as symbol completion and easy
KScope is a KDE front-end to Cscope. It provides a source-editing
environment for large C projects, such as the Linux kernel.
The "Tag List" plug-in is a source code browser for the Vim editor.
It provides an overview of the structure of source code files and
allows you to efficiently browse through source code files
in different programming languages.
Cxref is a C source code cross referencing and documenting program
for UNIX, written by Andrew M. Bishop.
Cxref makes both html and latex style document.
Sapid (Sophisticated API for software Development) is a CASE tool
platform based on Sophisticated Software Repository,
by Nagoya University.
Cscope is a developer's tool for browsing program code.
The cscope code has been released as Open Source by
Santa Cruz Operation, Inc. (SCO) under the BSD license.
Cbrowser is a graphical C/C++ source code searching and browsing tool,
and a hierarchical function call viewer, written by Chris Felaco.
Source-Navigator is a source code analysis tool by Source-Navigator Team.
With it, you can edit your source code, display relationships
between classes and functions and members, and display call trees.
It is distributed under GPL.
hypersrc is an open-source GUI program for browsing source code.
It displays a list of sorted source code tags and a tree view of functions.
A programmer can click a tag to hyperlink to its line in a source code file.
- ECB(Emacs Code Browser)
ECB is source code browser for Emacs.
It is a global minor-mode which displays a couple of
windows that can be used to browse directories, files and methods.
It supports method parsing for Java, C, C++, Elisp etc.
Htmlfontify provides a means of converting individual emacs buffers,
source files, or entire source trees to html, preserving formatting
and emacs colourisation / syntax highlighting as much as possible
through careful application of CSS style-sheets and html tags.
- GNU Source-highlight
Source-highlight, given a source file, produces a document with syntax
Perl, Php3, Python, Flex, ChangeLog and Ruby as source languages, and
HTML, XHTML and ANSI color escape sequences as output formats.
Documentation systems for source code
cldoc is a Clang based documentation generator for C and C++.
cldoc tries to solve the issue of writing C/C++ software documentation
with a modern, non-intrusive and robust approach.
phpDocumentor is the world standard auto-documentation tool for PHP.
Written in PHP, phpDocumentor can be used directly from the
command-line, or through an easy to use web interface.
ROBODoc is a documentation tool. It extracts specially formatted
comment headers from the source file and puts them in a separate file.
ROBODoc thus allows you to include the program documentation
in the source code and avoid having to maintain two separate documents.
Doxygen is a documentation system for C++, Java, IDL
(Corba, Microsoft and KDE-DCOP flavors) and C.
You can select output format in HTML, LaTeX, RTF (MS-Word),
PostScript, hyperlinked PDF, compressed HTML, and Unix man pages.
Synopsis is a general source code documentation tool.
By means of a modular structure it adapts to different styles of
embedded documentation, different programming languages and various
output formats. It scales well with the size of the project
by allowing processing to be controlled by Makefiles.
CWEB is a version of WEB for documenting C, C++, and Java programs.
WEB was adapted to C by Silvio Levy in 1987, and since then both
Knuth and Levy have revised and enhanced the system in many ways,
notably to support C++ and ANSI C. Thus CWEB combines TeX with
today's most widely used professional programming languages.
Hypertext of source code
- Elixir Linux Cross Referencer
A hypertext presentation of the Linux source code using the Elixir Cross Referencer.
- The Linux Source Navigator
This is a CGI interface to browse the entire Linux kernel source,
written by Ben Walter.
- FreeBSD and Linux Kernel Cross-Reference
This site provides experimental source code browsing for the FreeBSD and
Linux kernels by Robert Watson, based on the software provided by the
- Cross-Referencing Linux
A hypertext presentation of the Linux source code by
Arne Georg Gleditsch and Per Kristian Gjermshus
- UNIX kernel source tour!
This tour contains four kernels: FreeBSD, Linux, 4.3BSD and UNIX V7(historic UNIX).
UNIX and its clone's Kernel source code
- The Unix Heritage Society
Unix Archive contains 5th, 6th and 7th Edition Unix and more.
Now, you can use these source code under BSD style license.
- CSRG Archive CD-ROMs
Kirk McKusick is selling a 4CD set of all the 4BSD releases
from the Computer Systems Research Group.
This also includes 1, 2, and 3BSD.
*BSD's source code is freely available from their FTP sites,
and also available in CD sets. You can get the information from
their web site.
- The Linux Kernel Archives
This is the primary site for the Linux kernel source, but it has
much more than just kernels.
- GNU Hurd
The GNU Hurd is the GNU project's replacement for the Unix kernel.
You can get the latest Hurd source code via the GNU Project's
- MINIX 3
MINIX 3 is a new open-source operating system designed to be highly reliable,
flexible, and secure. It is loosely based somewhat on previous versions of MINIX,
but is fundamentally different in many key ways.
OpenIndiana is a community supported operating system, based on the illumos kernel.
It seems that it is a successor of OpenSolaris created by Sun Microsystems.