在spacemacs中使用rtags
Table of Contents
这是一篇教你怎么在linux上安装RTags, 然后将之用到spacemacs 上的说明.
我用的发行版是Ubuntu16.04,不过该过程应该基本适用于所有的发行版.
我们要做的事情包括安装RTags的依赖,构建并安装RTags,为项目创建RTags标签数据库,最后在spacemacs中启用rtags layer.
1 Dependencies
根据Readme中Installing rtags的内容, 我们需要如下依赖(带星号的表示可选的):
- clang-3.3 or higher
- cmake-2.8 or higher
- pkg-config*
- bash-completion*
- lua*
我用的是Ubuntu 16.04, 直接使用Ubuntu包管理器中的默认版本就行了.
sudo apt install -y clang libclang-dev cmake pkg-config bash-completion lua5.3
下载, 构建, 然后安装RTags
cd /tmp git clone --recursive git@github.com:Andersbakken/rtags.git cd rtags mkdir build && cd build cmake .. make -j8 sudo make install
2 Configure a service in systemd
2.1 为你的用户创建systemd配置目录
mkdir -p ~/.config/systemd/user
2.2 创建RTags daemon socket service配置文件
Add the following to ~/.config/systemd/user/rdm.socket
:
[Unit] Description=RTags daemon socket [Socket] ListenStream=%h/.rdm [Install] WantedBy=multi-user.target
2.3 创建 the RTags daemon service配置文件
Add the following to ~/.config/systemd/user/rdm.service
:
[Unit] Description=RTags daemon Requires=rdm.socket [Service] Type=simple ExecStart=/usr/local/bin/rdm --log-file=%h/.rtags/rdm.log --data-dir=%h/.rtags/rtags-cache --verbose --inactivity-timeout 300
启用socket service
systemctl --user enable rdm.socket systemctl --user start rdm.socket
3 Build an RTags database for your project
RTags使用的是clang来解析代码, 它需要知道项目使用的编译器flags.
有多种途径能 告诉RTags你使用的flags是什么.
我的项目用的时cmake,所以我可以生成一个 compile_commands.json
文件,这样RTags会从中获取信息.
cd ~/src/project mkdir build && cd build cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
现在可以用RTags来为代码生成索引了
rc -J ./compile_commands.json
这得花点儿时间, 我们可以通过查看日志文件的方式来了解进度,日志文件的地址可以在 ~/.config/systemd/user/rdm.service
中配置.
tail -f ~/.rtags/rdm.log
4 Enable RTags in spacemacs
现在开始让emacs支持RTags,然后分配一些快捷键.
这里用到的layer是mineo-rtags
我将这两个文件下载到我的spacemacs配置目录中
mkdir ~/.spacemacs.d/mineo-rtags && cd ~/.spacemacs.d/mineo-rtags
wget https://raw.githubusercontent.com/mineo/dotfiles/master/spacemacs/.emacs.d/private/layers/mineo-rtags/packages.el
wget https://raw.githubusercontent.com/mineo/dotfiles/master/spacemacs/.emacs.d/private/layers/mineo-rtags/keybindings.el
为了以防万一,我这里也把两个文件的内容列出来:
packages.el:
(defconst mineo-rtags-packages '(cmake-ide rtags)) (defun mineo-rtags/init-cmake-ide () (use-package cmake-ide :config (cmake-ide-setup))) (defun mineo-rtags/init-rtags () (use-package rtags :config (setq rtags-autostart-diagnostics t rtags-completions-enabled t rtags-use-helm t) (push '(company-rtags) company-backends-c-mode-common) (rtags-enable-standard-keybindings) (add-hook 'c-mode-common-hook 'rtags-start-process-unless-running)) (use-package flycheck-rtags :ensure rtags))
keybindings.el:
(defconst mineo-rtags-overrides '(("C-]" 'rtags-find-symbol-at-point) ("M-." 'rtags-find-symbol-at-point))) (defun mineo-rtags-set-evil-keys () (dolist (override mineo-rtags-overrides) (evil-local-set-key 'normal (car override) (cdr override)))) (add-hook 'c-mode-common-hook 'mineo-rtags-set-evil-keys) ;;; https://github.com/mheathr/spacemacs/blob/develop/contrib/!lang/c-c%2B%2B/packages.el (dolist (mode '(c-mode c++-mode)) (evil-leader/set-key-for-mode mode "g ." 'rtags-find-symbol-at-point "g ," 'rtags-find-references-at-point "g v" 'rtags-find-virtuals-at-point "g V" 'rtags-print-enum-value-at-point "g /" 'rtags-find-all-references-at-point "g Y" 'rtags-cycle-overlays-on-screen "g >" 'rtags-find-symbol "g <" 'rtags-find-references "g [" 'rtags-location-stack-back "g ]" 'rtags-location-stack-forward "g D" 'rtags-diagnostics "g G" 'rtags-guess-function-at-point "g p" 'rtags-set-current-project "g P" 'rtags-print-dependencies "g e" 'rtags-reparse-file "g E" 'rtags-preprocess-file "g R" 'rtags-rename-symbol "g M" 'rtags-symbol-info "g S" 'rtags-display-summary "g O" 'rtags-goto-offset "g ;" 'rtags-find-file "g F" 'rtags-fixit "g L" 'rtags-copy-and-print-current-location "g X" 'rtags-fix-fixit-at-point "g B" 'rtags-show-rtags-buffer "g I" 'rtags-imenu "g T" 'rtags-taglist "g h" 'rtags-print-class-hierarchy "g a" 'rtags-print-source-arguments)) (provide 'keybindings)
4.1 在spacemacs中启用mineo-rtags layer
dotspacemacs-configuration-layers
'(
(c-c++
:variables
c-c++-enable-clang-support t
)
syntax-checking
mineo-rtags
)
重启spacemacs,它会自动安装rtags这个package及其依赖.
所有的快捷键都以 ", g" 开头的
写于2016年8月26日