#tree-sitter #queries #syntastica #predicates #injection #pre-processor #comments

syntastica-query-preprocessor

syntastica 所使用的树-sitter 查询预处理器

2 个版本

0.4.1 2023 年 9 月 19 日
0.4.0 2023 年 9 月 19 日

#4 in #syntastica


用于 syntastica

GPL-3.0-only

99KB
2K SLoC

syntastica-query-preprocessor

syntastica 使用的树-sitter 查询预处理器。

更多信息请参阅 项目概述

概述

syntastica-query-preprocessor 是一个用于树-sitter 查询的预处理器,它允许使用 ; 继承 <lang> 注释,有条件地跳过注释节点,使用额外的谓词如 lua-match?contains?any-of?,Neovim 的旧注入语法,以及优先级翻转的顺序反转。该包可用于使用为 Neovim 设计的查询,通过官方的 tree-sitter Rust 绑定,进行最少的手动更改。

用法

此包公开了六个公共函数

前三个用于对单个查询源文件进行简单的预处理,该源文件作为 &str 传入。

后三个假设目录结构为 queries/<lang_name>/<highlights|injections|locals>.scm(其中 queries 是由 base_dir 参数指向的目录),并从文件系统中读取查询。这允许在查询文件中使用 ; 继承 <lang_one>[,<lang_two>,...] 注释来包含另一个语言查询文件的内容。参数 lang_name 指定条目查询文件所在的目录名称。

所有六个函数都接受两个参数 strip_commentnvim_like。参数 strip_comment 指定了一个注释字符串,该字符串将指示要排除在输出之外的节点。这必须包括开头的 ;,因此传递空字符串不会排除任何内容。

nvim_like 设置为 true 主要执行以下操作

#[not-]lua-match?#[not-]any-of?#[not-]contains? 断言被替换为表达相同约束的 #match?#not-match? 断言。请注意,正则表达式不能表示所有 Lua 模式,因此从 lua-matchmatch 的转换可能会失败并引发恐慌。

根据查询类型,附加行为会有所不同

  • 对于高亮查询,查询的顺序被反转。这是必要的,因为 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