2 个版本
| 0.4.1 | 2023 年 9 月 19 日 |
|---|---|
| 0.4.0 | 2023 年 9 月 19 日 |
#4 in #syntastica
用于 syntastica
99KB
2K SLoC
syntastica-query-preprocessor
syntastica 使用的树-sitter 查询预处理器。
更多信息请参阅 项目概述。
概述
syntastica-query-preprocessor 是一个用于树-sitter 查询的预处理器,它允许使用 ; 继承 <lang> 注释,有条件地跳过注释节点,使用额外的谓词如 lua-match?,contains? 和 any-of?,Neovim 的旧注入语法,以及优先级翻转的顺序反转。该包可用于使用为 Neovim 设计的查询,通过官方的 tree-sitter Rust 绑定,进行最少的手动更改。
用法
此包公开了六个公共函数
process_highlightsprocess_injectionsprocess_localsprocess_highlights_with_inheritsprocess_injections_with_inheritsprocess_locals_with_inherits
前三个用于对单个查询源文件进行简单的预处理,该源文件作为 &str 传入。
后三个假设目录结构为 queries/<lang_name>/<highlights|injections|locals>.scm(其中 queries 是由 base_dir 参数指向的目录),并从文件系统中读取查询。这允许在查询文件中使用 ; 继承 <lang_one>[,<lang_two>,...] 注释来包含另一个语言查询文件的内容。参数 lang_name 指定条目查询文件所在的目录名称。
所有六个函数都接受两个参数 strip_comment 和 nvim_like。参数 strip_comment 指定了一个注释字符串,该字符串将指示要排除在输出之外的节点。这必须包括开头的 ;,因此传递空字符串不会排除任何内容。
将 nvim_like 设置为 true 主要执行以下操作
#[not-]lua-match?、#[not-]any-of? 和 #[not-]contains? 断言被替换为表达相同约束的 #match? 或 #not-match? 断言。请注意,正则表达式不能表示所有 Lua 模式,因此从 lua-match 到 match 的转换可能会失败并引发恐慌。
根据查询类型,附加行为会有所不同
- 对于高亮查询,查询的顺序被反转。这是必要的,因为 Neovim 优先考虑文件中更靠下的查询,而官方 tree-sitter Rust 绑定 则相反。
- 对于注入查询,Neovim 曾经使用
@<lang_name>、@content、@language和@combined捕获。这些将分别替换为新(且官方)的语法,使用#set! injection.language "<lang_name>"、@injection.content、@injection.language和#set! injection.combined。 - 对于局部查询,Neovim 使用
@scope、@reference和各种@definition.<kind>捕获。这些将被官方的@local.scope、@local.reference和@local.definition捕获所替换。
依赖关系
~2.4–4MB
~72K SLoC