This post is for those people who use Exuberant Ctags. If you are
using
other versions of ctags,
this post may not be useful.
When using ctags to generate the tags file for C/C++ projects, usually we
use the following command:
For some users that need more info of the symbols, they may use this command
instead:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
No matter which one you use, the generated tags file only contains the symbols
in the files in your project source tree, but not any external file, such as
standard header files (e.g. stdio.h, stdlib.h), etc. thus editors or IDEs that
use tags files, such as Vim, are not able to locate symbols in external
header files. There was a solution: generate a tags file for any external header
files first, and let the editor or IDE read both the generated tags file and the
tags file for the project source tree. For example, the following command will
generate a tags file for all your system header files on UNIX/Linux:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q /usr/include
This command usually takes a very long time to finish, and finally it gives a
quite large tags file, which causes the editor or IDE a long time to search this
tags file for symbols. To solve this problem, I came up with another idea.
Why must we generate a tags file containing all the symbols in the system
header? If we only generate the tags file only for the header files that are
related to our projects, would it be faster? That's the point of this idea. We
could first search for the header files that are included in our projects, and
then we use ctags to generate a tags file for these files and our source files,
in this way, a much smaller tags file that containing all the symbols that maybe
useful for the project is generated.