如何使用treesitter创建一个新的捕获组来更新neovim中的突出显示优先级?

问题描述 投票:0回答:1

作为前言 - 我对 Neovim 非常陌生(上周安装并配置了它),所以请原谅我的知识差距。

我正在尝试更新由 Treesitter 为

@lsp.typemod.variable.declaration.typescriptreact
突出显示组定义的优先级,因为它与
@lsp.typemod.variable.readonly.typescriptreact
具有相同的优先级,并且我希望前一个组优先。我的目标是使用与
Type
相同的突出显示颜色(在我的例子中为黄色)对变量声明进行着色,同时保持非声明与
@constant
相同的颜色。

enter image description here

我尝试使用

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
突出显示颜色。

我确信我在这里遗漏了一些明显的东西,但我一直在尝试大量不同的解决方案,所以我想我应该把我的问题带到这里。

感谢您的帮助!

neovim treesitter
1个回答
0
投票

好吧,我明白了。

需要 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。

© www.soinside.com 2019 - 2024. All rights reserved.