
如何为 Helix 编写 tags.scm 查询实现文档与工作区符号选择器【免费下载链接】helixA post-modern modal text editor.项目地址: https://gitcode.com/GitHub_Trending/he/helixHelix 对没有语言服务器LSP配合的语言可以基于 tree-sitter 语法树提供 LSP 式的文档符号和工作区符号选择器前提是你要为该语言编写一个tags.scm查询文件。这篇文章的任务就是为一个已有 tree-sitter grammar 的语言写出tags.scm让 Helix 的Space-s文档符号和Space-S工作区符号选择器能列出该语言的函数、类、模块等符号及它们的引用位置。前置条件该语言已经有可用的 tree-sitter grammar并在 Helix 中配置了 grammar即languages.toml中有对应的[[grammar]]条目。查询文件放在哪里按 tags 指南 的说明文件位置分两种情况正式向 Helix 贡献时放在runtime/queries/{language}/tags.scm其中{language}是语言名与languages.toml中的name一致例如仓库自带的 Picat 示例 就位于runtime/queries/picat/tags.scm。本地测试阶段可以把查询文件放到本机的 runtime 目录文档以 Linux 为例~/.config/helix/runtime。tags.scm是 查询文件列表 中可选的文件之一只有highlights.scm是必需的其用途一栏写的是 document/workspace symbol pickers。如果你在开发中使用自己维护的runtime目录按 语言添加指南 的常见问题一节需要把环境变量HELIX_RUNTIME指向该runtime目录否则 Helix 可能找不到你的查询。编写 definition.* 捕获定义符号tags.scm的核心工作是把语法树中有意义的节点打上捕获。第一类捕获是definition.*标记一个符号的定义位置。文档符号选择器只识别以下捕获名列表外的捕获名会被忽略捕获名definition.classdefinition.constantdefinition.enumdefinition.fielddefinition.functiondefinition.interfacedefinition.macrodefinition.moduledefinition.sectiondefinition.structdefinition.type因此规则是语言特有的构造应映射到上表中最接近的种类而不是自创新捕获名。写规则时遵守两个约定definition.*捕获整个定义节点同一个匹配中再用name捕获该定义内部的名字标识符节点。文档给出的示例以function_definition/class_definition节点为例(function_definition name: (identifier) name) definition.function (class_definition name: (identifier) name) definition.class对照仓库中真实的 Picat 查询可以看到一个更完整的定义模式多个构造function_definition、predicate_definition、actor_definition通过[...]列表归入同一个definition.function捕获并用name: (_) name捕获名字节点文件末尾还有(module_declaration (_) name) definition.module这样的模块定义。编写 reference.* 捕获引用位置第二类捕获标记调用点或类型引用供工作区符号搜索定位用途usages。常见变体是reference.call函数调用和reference.class类引用同样用name捕获标识符(call function: (identifier) name) reference.callPicat 示例中的对应写法是(function_call function: (_) name reference.call)。验证查询是否可用查询写好后有两层验证编译期检查在 Helix 源码仓库中运行cargo xtask query-check [language]把[language]替换为你的语言名。该命令校验查询文件能否针对对应 grammar 编译通过——语言添加指南 要求所有查询文件都能通过这一检查。效果检查用 Helix 打开该语言的文件按Space-s打开文档符号选择器、Space-S打开工作区符号选择器见 键位表 中 space 模式条目两者都标注为LSPorTS即语言服务器不可用时回退到 tree-sitter 的tags.scm。如果选择器里列出了你在查询中标记的定义与引用说明查询生效。另外如果你在切换分支或新增 grammar 后运行 Helix 出现错误按同一指南的常见问题一节执行hx --grammar fetch拉取 grammar、hx --grammar build重建过期 grammar。限制只有definition.*列表中列出的捕获名会被符号选择器识别其余捕获名一律忽略。tags.scm本身不决定符号选择器的按键与过滤行为选择器文档 说明工作区符号选择器会把搜索词直接传给语言服务器而基于语法的符号路径TS 回退由本文的查询决定内容。下一步如果你需要为该语言补齐高亮或嵌入语法可继续参考 查询文件对照表 中的highlights.scm、injections.scm等条目并同样用cargo xtask query-check [language]校验。【免费下载链接】helixA post-modern modal text editor.项目地址: https://gitcode.com/GitHub_Trending/he/helix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考