原文 https://maskray.me/blog/2017-12-03-c++-language-server-cquery
## cquery安裝、配置
<https://github.com/jacobdufault/cquery>。Arch Linux可用[aur/cquery-git](https://aur.archlinux.org/packages/cquery-git)。
* 構建language server可執行文件
+ `./waf configure`
+ `./waf build`,構建`build/$variant/bin/cquery`
* 編輯器安裝language client插件(Emacs lsp-mode、Neovim LanguageClient-neovim、VSCode安裝cquery/vscode-client裏的插件)
* 爲你的C/C++/Objective-C項目生成`compile_commands.json`,參見下文。
用編輯器打開C++文件時,language client插件會根據配置的language server可執行文件路徑啓動language server進程,用[JSON-RPC 2.0](http://www.jsonrpc.org/specification)協議通過stdio通信,協議內容見<https://microsoft.github.io/language-server-protocol/specification>。
Language client用`initialize`請求告知language server自己支持的功能(ClientCapabilities)、項目路徑(rootUri)、初始化選項(initializationOptions,cquery需要知道`cacheDirectory`路徑)。之後各種語言相關功能都通過與language server通信實現:
+ 光標移動時向language server發送`textDocument/hover`請求,language server返回變量/函數聲明信息、註釋等
+ 查找定義發送`textDocument/definition`請求,language server返回定義所在的文件、行列號
+ 查找引用發送`textDocument/references`請求
+ 查找當前文檔定義的符號(通常是頂層的outline)發送`textDocument/documentSymbol`請求
+ 查找項目定義的符號(只查找outline的也很有用)發送`workspace/symbol`請求
+ 補全`textDocument/completion`
+ 文檔編輯操作發送`textDocument/didChange`
+ cquery還支持一些Language Server Protocol之外的擴展,比如`$cquery/derived`用於查找派生的類、方法等
## cquery安裝、配置
<https://github.com/jacobdufault/cquery>。Arch Linux可用[aur/cquery-git](https://aur.archlinux.org/packages/cquery-git)。
* 構建language server可執行文件
+ `./waf configure`
+ `./waf build`,構建`build/$variant/bin/cquery`
* 編輯器安裝language client插件(Emacs lsp-mode、Neovim LanguageClient-neovim、VSCode安裝cquery/vscode-client裏的插件)
* 爲你的C/C++/Objective-C項目生成`compile_commands.json`,參見下文。
用編輯器打開C++文件時,language client插件會根據配置的language server可執行文件路徑啓動language server進程,用[JSON-RPC 2.0](http://www.jsonrpc.org/specification)協議通過stdio通信,協議內容見<https://microsoft.github.io/language-server-protocol/specification>。
Language client用`initialize`請求告知language server自己支持的功能(ClientCapabilities)、項目路徑(rootUri)、初始化選項(initializationOptions,cquery需要知道`cacheDirectory`路徑)。之後各種語言相關功能都通過與language server通信實現:
+ 光標移動時向language server發送`textDocument/hover`請求,language server返回變量/函數聲明信息、註釋等
+ 查找定義發送`textDocument/definition`請求,language server返回定義所在的文件、行列號
+ 查找引用發送`textDocument/references`請求
+ 查找當前文檔定義的符號(通常是頂層的outline)發送`textDocument/documentSymbol`請求
+ 查找項目定義的符號(只查找outline的也很有用)發送`workspace/symbol`請求
+ 補全`textDocument/completion`
+ 文檔編輯操作發送`textDocument/didChange`
+ cquery還支持一些Language Server Protocol之外的擴展,比如`$cquery/derived`用於查找派生的類、方法等