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_highlights
process_injections
process_locals
process_highlights_with_inherits
process_injections_with_inherits
process_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