Emacs as C++ IDE, easy way
CREATED:
UPDATED:
This solution works on Linux/macOS/Cygwin (should work at Windows too, but I don't develop at Windows).
Setup is minimum. Only GNU Global and two Emacs plugins are required:
-
company-gtags.el
from company for code completion - emacs-helm-gtags or emacs-counsel-gtags (recommended) for code navigation
Here is the step to step guide.
Step 1, create sample projects for experiment
I have two projects ~/proj1
and ~/proj2
.
Both projects use files from read only directories /usr/include
and /usr/src/linux/include
.
We create a new directory ~/obj
to store index files created by GNU Global because directories of third party libraries are read only.
Let's create directories,
mkdir -p ~/{proj1,proj2,obj}
The content of ~/proj2/lib.cpp
,
void proj2_hello(int a2, char* b2) {
}
The content of ~/proj1/main.cpp
,
void proj1_hello(int a1, char* b1) {
}
int main(int argc, char *argv[]) {
return 0;
}
Step 2, scan C++ code and setup Emacs
Run below command in shell to scan code,
# dump index files to directory ~/obj if 3rd party library directory is read only
cd /usr/include && MAKEOBJDIRPREFIX=~/obj gtags --objdir
cd /usr/linux/include && MAKEOBJDIRPREFIX=~/obj gtags --objdir
# # above two command lines are same as below two command lines
# mkdir -p ~/obj/usr/include && cd /usr/include && gtags --objdir=~/obj/usr/include
# mkdir -p ~/obj/usr/linux/include && cd /usr/linux/include && gtags --objdir=~/obj/usr/linux/include
...
# index files are placed inside the projects
cd ~/proj1 && gtags
cd ~/proj2 && gtags
...
Global introduced MAKEOBJDIRPREFIX
on 2008-03-23. I tested with GNU Global v6.6.2
on Debian.
After installing Emacs plugins and setup (minimum setup from their website is enough), insert below code into ~/.emacs,
;; `file-truename' MUST be used!
(setenv "GTAGSLIBPATH" (concat "/usr/include"
":"
"/usr/src/linux/include"
":"
(file-truename "~/proj2")
":"
(file-truename "~/proj1")))
(setenv "MAKEOBJDIRPREFIX" (file-truename "~/obj/"))
(setq company-backends '((company-dabbrev-code company-gtags)))
Usage
Use the Emacs plugins as usual.
But you need install latest company built on 25th August because I fixed a company issue yesterday.
Screenshot,
Tip
GNU Global could use ctags (Either Exuberant Ctags or Universal Ctags) as backend to create tags file.
I suggest NOT doing so. Or else I'm not sure the company-mode
or emacs-counsel-gtags
will work.
If you prefer ctags, you could use it directly. Then you can use company-ctags plus company-mode for auto-completion. Use counsel-etags for navigation.
Technical Details (Optional)
Check GNU Global manual to understand environment variables GTAGSLIBPATH
and MAKEOBJDIRPREFIX
.