完美的 c++ 项目代码定义跳转

编译数据库

bazel

  • 安装

    使用 Bazel And Compile Commands
    脚本可以很方便地为 Bazel 构建项目生成 compile_commands.json

    git clone https://github.com/vincent-picaud/Bazel_and_CompileCommands.git
  • 生成

    ../Bazel_and_CompileCommands/setup_compile_commands.sh
    ../Bazel_and_CompileCommands/create_compile_commands.sh //...

make

Bear
是一个生成生成编译数据库的工具,其工作原理是监视编译工具(如:make)调用的编译命令, 是一种很通用的实现。

  • 安装

    yaourt -S bear
  • 生成

    bear make

cmake

  • 安装

    yaourt -S cmake
  • 生成

    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

rtags

RTags is a client/server application that indexes C/C++ code and keeps a persistent file-based database of references, declarations, definitions, symbolnames etc.

由于 rtags
是基于 clang,根据编译器提供的信息可以实现精确的查找定义、引用及调用等。

启动后台服务

nohup rdm &

提交项目信息到后台服务

由于 bazel 会将代码通过软链接放到一个沙箱中进行编译,导致生成的编译数据库中代码目录与实际编辑的路径不一致, 使用 rtags 查找定义时会报 “/xxx/xxx.cpp not indexed” 错误,可以通过提交项目信息时指定 --project-root
进行修正。

rc -J . --project-root $PWD

配置 emacs

请参考 https://github.com/Andersbakken/rtags#elisp

以下是我的配置

;;;; rtags
(defun run-rtags ()
  "startup rtags serve for project under current directory"
  (interactive)
  (rtags-start-process-unless-running)
  ;; compile_commands.json generate by https://github.com/vincent-picaud/Bazel_and_CompileCommands
  ;; will refer source code from bazel's sandbox, must use "--project-root" to fix it.
  (let ((project-root default-directory))
    (while (and project-root (not (file-exists-p (concat project-root "compile_commands.json"))))
      (setq project-root (file-name-directory (directory-file-name project-root))))
    (if (not project-root)
        (error "RTags: compile_commands.json not found"))
    (message "RTags: %s found" (concat project-root "compile_commands.json"))
    (shell-command (format "rc -J %s --project-root %s" project-root project-root))))
(setq rtags-completions-enabled t)
(eval-after-load 'company
  '(add-to-list
    'company-backends 'company-rtags))
(setq rtags-autostart-diagnostics t)
(rtags-enable-standard-keybindings)
(require 'helm-rtags)
(require 'flycheck-rtags)
(define-key c-mode-map (kbd "C-c C-j") 'rtags-find-symbol-at-point)
(define-key c++-mode-map (kbd "C-c C-j") 'rtags-find-symbol-at-point)
(define-key c-mode-map (kbd "C-c C-b") 'rtags-location-stack-back)
(define-key c++-mode-map (kbd "C-c C-b") 'rtags-location-stack-back)
(define-key c-mode-map (kbd "C-c C-r") 'rtags-find-references-at-point)
(define-key c++-mode-map (kbd "C-c C-r") 'rtags-find-references-at-point)

需要安装这些 emacs 包: rtags
helm-rtags
company-rtags
flycheck-rtags
, 通过 M-x run-rtags
启动 rdm

参考

稿源:看看俺 (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 后端存储 » 完美的 c++ 项目代码定义跳转

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录