如何用TreeSitter创建捕获组提升Neovim中TSReact变量声明高亮优先级
解决方法
你的问题核心是搞错了高亮组的来源:@lsp.typemod.variable.declaration.typescriptreact 这类以@lsp开头的高亮组来自LSP语义高亮,不是TreeSitter本身的查询捕获,所以你之前通过TreeSitter查询和custom_captures的方法根本不会生效。
正确的做法是直接修改这两个LSP高亮组的优先级和链接关系,具体步骤如下:
方法1:用自动命令在LSP连接时设置
在你的Neovim配置文件(比如init.lua)里添加这段代码:
vim.api.nvim_create_autocmd('LspAttach', { callback = function(args) local client = vim.lsp.get_client_by_id(args.data.client_id) -- 只针对TypeScript/React的LSP生效(比如tsserver) if client and client.name == 'tsserver' then -- 给变量声明组设置更高优先级(128),并链接到Type高亮 vim.api.nvim_set_hl(0, '@lsp.typemod.variable.declaration.typescriptreact', { link = 'Type', priority = 128 }) -- 给只读变量组设置更低优先级(100),链接到Constant高亮 vim.api.nvim_set_hl(0, '@lsp.typemod.variable.readonly.typescriptreact', { link = 'Constant', priority = 100 }) end end, })
方法2:用after/syntax文件持久化设置
在~/.config/nvim/after/syntax/tsx.vim文件里添加:
" 强制覆盖并设置优先级 highlight! link @lsp.typemod.variable.declaration.typescriptreact Type highlight! @lsp.typemod.variable.declaration.typescriptreact priority=128 highlight! link @lsp.typemod.variable.readonly.typescriptreact Constant highlight! @lsp.typemod.variable.readonly.typescriptreact priority=100
为什么之前的方法没用?
你在highlights.scm里写的查询是给TreeSitter自己的捕获组设置优先级,但@lsp.xxx组是LSP服务(比如tsserver)发送的语义高亮信息,和TreeSitter的查询完全是两个系统,所以你的配置根本影响不到它。
另外,custom_captures是用来映射TreeSitter捕获组到Vim高亮组的,你写的["variable_declaration"] = "Type"是把TreeSitter的variable_declaration捕获组链接到Type,但这个捕获组和LSP的@lsp.typemod.variable.declaration.typescriptreact没有任何关系,自然不会生效。
内容的提问来源于stack exchange,提问作者Christopher Oka
相关产品推荐
相关产品推荐

