В качестве предисловия: я новичок в 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()
).
По какой-то причине опция «custom_captures» в функции настройки Treesitter у меня не работала, поэтому вместо этого я использовал подсветку.
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
...
}
Я надеюсь, что это поможет кому-то еще, если они тоже столкнулись с подобной проблемой.
ТЛ;ДР: РТФМ.