EMACS-DOCUMENT

=============>随便,谢谢

在spacemacs中使用rtags

这是一篇教你怎么在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日