作为前言 - 我对 Neovim 非常陌生(上周安装并配置了它),所以请原谅我的知识差距。
我正在尝试更新由 Treesitter 为
@lsp.typemod.variable.declaration.typescriptreact
突出显示组定义的优先级,因为它与 @lsp.typemod.variable.readonly.typescriptreact
具有相同的优先级,并且我希望前一个组优先。我的目标是使用与 Type
相同的突出显示颜色(在我的例子中为黄色)对变量声明进行着色,同时保持非声明与 @constant
相同的颜色。
我尝试使用
highlight link
,但由于它们具有相同的优先级,有时前一组优先,有时后一组优先。
从文档和在线阅读来看,似乎创建一个与
@lsp.typemod.variable.declaration.typescriptreact
关联的新捕获组并设置更高的优先级将是这里的解决方案。
不幸的是,到目前为止我所尝试的一切似乎都不起作用。我在
highlights.scm
下创建了一个 nvim/after/queries/tsx/highlights.scm
文件夹并添加了以下代码:
;; extends
((variable_declaration) @lsp.typemod.variable.declaration.typescriptreact (#set! "priority" 128))
在 Treesitter 的设置函数中,我添加了这段代码(使用lazy.nvim):
{
'nvim-treesitter/nvim-treesitter',
opts = {
...
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
custom_captures = {
["variable_declaration"] = "Type"
}
},
},
...
}
在这里,我尝试将刚刚定义的
variable_declaration
捕获组映射到 Type
突出显示颜色。
我确信我在这里遗漏了一些明显的东西,但我一直在尝试大量不同的解决方案,所以我想我应该把我的问题带到这里。
感谢您的帮助!
好吧,我明白了。
需要 RTFM 来学习 Treesitter 查询语法,它就像一个魅力。我使用
:InspectTree
获取捕获组,并使用 :Inspect
查看我的自定义捕获组是否被 Treesitter 识别。
这是我为了弄清楚语法而阅读的内容:
nvim/after/queries/typescript/highlights.scm
;; extends
(
(variable_declarator
name: (identifier) @variable_declaration
)
(#set! "priority" 128)
)
(
(variable_declarator
name: (array_pattern
(identifier) @declaration_array_member
))
(#set! "priority" 128)
)
这里,第一个查询是抓取
identifier
中出现的所有 variable_declarator
,并将 identifier
的名称设置为 @variable_declaration
。第二个捕获组正在抓取 identifier
中出现的所有 array_pattern
并将这些标识符命名为 @declaration_array_member
。我用于解构数组的第二个(例如。const [foo, bar] = someFunction()
)。
由于某种原因,Treesitter 设置功能中的“custom_captures”道具对我不起作用,所以我最终使用了高亮显示。
nvim/lua/plugins.lua
{
'nvim-treesitter/nvim-treesitter',
opts = {
...
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
-- Removed since it wasn't working
-- custom_captures = {
-- ["variable_declaration"] = "Type"
-- }
},
},
config = function()
vim.cmd([[
highlight! link @variable_declaration @type
highlight! link @declaration_array_member @type
]])
...
end
...
}
如果其他人也遇到类似的问题,我希望这对其他人有帮助。
TL;DR:RTFM。