需求

代码自动补全需要 tags.

解决

生成 tags

tags 生成工具

使用 gtags 生成 tags, 如果没有 gtags=,需要安装 =global.

sudo apt install global

生成 tags

# dump index files to directory ~/obj if 3rd party library directory is read only
cd /usr/include && MAKEOBJDIRPREFIX=~/obj gtags --objdir
cd /usr/src/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
...

emacs 配置

elorg 配置文件中增加:

;; `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)))

打开 cpp 文件后,需要 M-x 开启 company-mode, 但是有些能补全,有些不能补全,具体原因还在寻找。多个可选时,使用 M-n, M-p 来进行选择。

参考

Emacs as C++ IDE, easy way

company-mode

company gtags 补全的一些问题

Ubuntu 安裝 GNU Global(gtags) 阅读Linux内核源码