VSCode 已经成了我的主力编辑器,包括用来写 C++。虽然默认的 cpptools 插件已经很好用了,但 cquery 插件更加强大,极力推荐。
cquery 是基于 LSP(Language-Server-Protocol)的。LSP 是微软推出的开源的语言服务器协定,语言服务端提供索引代码的服务,编辑器直接调用,用来实现语法补全及各种索引重构功能。
cquery 就是其中一种 C/C++/Objective-C 的 language server。它的特点是速度非常非常的快,延迟特别低,它设计出来就是为了在大型的代码工程里也能很好的使用。比如 Chromium、V8 这样的大型工程。
心动不如行动,赶紧折腾起来吧,以我的 Mac 为例:
1. 编译 cquery
git clone https://github.com/cquery-project/cquery.git --recursive
cd cquery
git submodule update --init
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=release -DCMAKE_EXPORT_COMPILE_COMMANDS=YES
make install -j8
问题来了,最新的 cquery 默认依赖 clang 7.0.0,而我的 Mac 上是 6.0.0。所以上面的 cmake 命令执行后,会报下面的错:
No SHA256 hash available for the current platform (Darwin) + clang version
(6.0.0) combination.
看了下 cquery 的编译脚本,解决方法也很简单,手工创建一个 6.0.0 的 SHA256 文件:
cd cquery
echo 0ef8e99e9c9b262a53ab8f2821e2391d041615dd3f3ff36fdf5370916b0f4268 > clang_archive_hashes/clang+llvm-6.0.0-x86_64-apple-darwin.tar.xz.SHA256
再执行 cmake 会自动下载 clang+llvm-6.0.0-x86_64-apple-darwin.tar.xz。但是下载很慢,可以手工下载(https://releases.llvm.org/6.0.0/clang+llvm-6.0.0-x86_64-apple-darwin.tar.xz )好,并解压到 build 目录,然后上面的命令就可以顺利的进行下去了。
编译后的二进制会在 release/bin
目录,稍后把路径填入 VSCode 的配置中。
2. VSCode 安装 cquery 插件
直接在 VSCode 里搜 cquery 插件安装即可。然后在 VSCode 里设置:
{
"cquery.launch.command": "/absolute/path/to/cquery/release/bin/cquery",
"cquery.cacheDirectory": "/User/your-name/.cquery-cache/",
"cquery.completion.include.blacklist": [".*/.vscache/.*", "/tmp.*", "build/.*"],
}
其他相关设置,可参考一下(关掉 cpptools 相关设置)
{
"C_Cpp.autocomplete": "Disabled",
"C_Cpp.formatting": "Disabled",
"C_Cpp.errorSquiggles": "Disabled",
"C_Cpp.intelliSenseEngine": "Disabled",
"editor.autoClosingBrackets": "never",
}
3. 生成 compile_commands.json
compile_commands.json
文件是 cquery 用来索引你的代码工程所需要的。它可以从 cmake 里直接生成出来,只需要在 cmake 的编译参数里加:
-DCMAKE_EXPORT_COMPILE_COMMANDS=YES
然后把生成的 compile_commands.json 拷到工程的根目录。
4. 可以开心愉快的玩耍了
作者:CoderZh
微信关注:hacker-thinking (代码随想)
本文出处:https://blog.coderzh.com/2018/10/14/cquery/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。