跳转至

LSP 和 C++

之前时间,巨硬发布了 LSP(Language Server Protocol),目的是解决目前 IDE 和各语言的 m+n 问题。想法很好,不过直到最近,终于有我觉得可以用的工具出来了,并且已经代替了我在使用的其它的插件。

由于我最近主要就是做做程设作业,做做 OJ 这些,主要就是和 C++ 打交道。所以我当然就开始找一些比较成熟的 C++的 LSP server。有一个 Sourcegraph 维护的 langserver.org ,上面有着目前的各个语言和编辑器/IDE 的支持情况,我刚才提到的 cquery 也会加入到这个列表里去。从这个列表里可以看到,我用的比较多的 Python 和 Haskell 都已经有不错的的 LSP server,我已经开始在本地体验 pyls 和 hie 了,感觉做得挺不错的。

回到 C++,我的主力编辑器是 Emacs,其次是 CLion,而 Emacs 上的LSP 支持 lsp-mode也在快速发展,与之配合的lsp-ui 也出现了很多很棒的功能。

下面开始编译并配置cquery

git clone https://github.com/jacobdufault/cquery --recursive
cd cquery
./waf configure # to use system clang, append --use-system-clang
./waf build

然后配置 Emacs:

(use-package lsp-mode
  :ensure t
  :diminish
  lsp-mode
  :commands
  (lsp-mode)
  :config
  (lsp-define-stdio-client
   lsp-pyls
   "python"
   #'get-project-root
   '("/usr/local/bin/pyls")))

(use-package lsp-ui
  :commands
  lsp-ui-mode
  :init
  (add-hook 'lsp-mode-hook 'lsp-ui-mode))

(use-package cquery
  :load-path
  "path_to_cquery/emacs"
  :config
  (setq
     cquery-executable "path_to_cquery/build/app"
     cquery-resource-dir "path_to_cquery/clang_resource_dir"))

接下来,需要配置 基于 Clang 的 工具都需要的 Compilation Database。Sacrasm 对这个有一个非常完整的总结 ,可以查看里面的方法。我这里推荐在 CMake 项目中用 CMake 自带的,加上nickdiego/compiledb-generator 应付基于Makefile/Autotools的项目。如果都不适用,就按照cquery的README写一个简单的.cquery文件即可,不需要Bear那种必须关闭SIP的方案。

然后就可以享受很多功能了!还是挺好用的。

评论