NeoVim 0.10:Rust代码中SQL语法高亮的Tree-sitter注入问题
解决Rust中带属性标注的SQL字符串Tree-sitter注入高亮问题
你的问题核心是string_literal包含首尾双引号,导致SQL解析器无法正确识别内部的SQL语法。虽然查询在Tree-sitter playground能匹配到目标字符串,但需要通过#offset!指令裁剪掉引号,才能让注入生效。
修正后的查询语句
把#offset!直接附加在@injection.content的定义行后,调整后的完整查询如下:
( (attribute_item (attribute (identifier) @ident (#any-of? @ident "select" "insert") ) ) . (function_item body: (block (string_literal) @injection.content (#offset! @injection.content 0 1 0 -1)) ) (#set! injection.language "sql") )
关键说明
(#offset! @injection.content 0 1 0 -1):- 前两个参数
0 1:从字符串的第0行第1列开始(跳过开头的双引号) - 后两个参数
0 -1:到字符串的第0行倒数第1列结束(跳过结尾的双引号)
这样就把字符串内部的纯SQL内容提取出来,交给SQL解析器处理语法高亮。
- 前两个参数
验证步骤
- 将上述查询保存到
~/.config/nvim/after/queries/rust/injections.scm - 确保Neovim已安装Tree-sitter的Rust和SQL解析器(可通过
:TSInstall rust sql安装) - 重启Neovim后,打开目标Rust文件,带
#[select]/#[insert]标注的函数内的字符串就会正确应用SQL语法高亮。
内容的提问来源于stack exchange,提问作者Achim
相关产品推荐
相关产品推荐

