ccls 与 LSP 语义标记

作者花费大量时间编写和阅读 C++代码,多年来 Emacs 是其主要编辑器,利用ccls的彩虹语义高亮功能。该功能依赖两个自定义通知消息$ccls/publishSemanticHighlight$ccls/publishSkippedRanges,前者提供符号列表及相关信息。
结构CclsSemanticHighlightSymbol包含符号 ID、父类型、自身类型、存储时长、范围列表等,CclsSemanticHighlight包含文档 URI 和符号列表。编辑器可通过一致颜色突出显示符号不同出现,不同符号可分配不同颜色。
Tobias Pisani 于 2017 年 11 月创建 emacs-cquery,作者 2018 年初为自用添加彩虹语义高亮功能,设置依赖于加粗和下划线静态存储变量、斜体成员函数和变量等。
作者的 Emacs 黑客时代已过去,Elisp 技能退化后更多使用 Neovim,希望将 C++开发工作流迁移到 Neovim,但 Neovim 缺乏 Emacs 中的彩虹高亮,不过 Neovim 支持 LSP 3.16 的“语义令牌”,作者对 ccls 进行更改以支持语义令牌,利用一些令牌修饰符进行高亮,如static等,设置highlight.rainbow为 10 以实现不同修饰符 ID 的自定义前景色。
分析 C++代码时视觉效果良好,但仍需帮助实现代码镜头功能。
关于非活动代码高亮,作者简单禁用了该功能。在打开大型项目时,初始索引或缓存加载过程耗时,语义令牌列表为空,现有workspace/semanticTokens/refresh请求不接受文本文档参数,而$ccls/publishSemanticHighlight可在索引更新后主动发送通知。
在其他客户端方面,Emacs 用户可删除特定行以使用新功能分支,对于如何在 lsp-mode 和 emacs-ccls 中更改lsp-semantic-token-modifier-faces以支持彩虹语义令牌,有相应的设置方法;vscode-ccls 需协助消除$ccls/publishSemanticHighlight功能并采用内置语义令牌支持,由于缺乏维护无法维护该插件。
作者还使用技巧在不更改编辑器配置的情况下切换 ccls 构建,通过设置/tmp/ccls-build文件来选择不同的构建类型(如stracedebugrelease等),然后执行相应的 ccls 命令。

阅读 21
0 条评论