diff options
author | Stephan Seitz <stephan.seitz@fau.de> | 2022-02-16 19:38:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 19:38:19 +0100 |
commit | 8ab5ec4aaaeed27b1d8086d395171a52568378c2 (patch) | |
tree | fe3f768c88c060b6b097dfc800d562183f165ebd /runtime/lua/vim/treesitter/highlighter.lua | |
parent | 9fe8d2c9df2decccd09828cb99ae7a19635c7dc3 (diff) | |
download | rneovim-8ab5ec4aaaeed27b1d8086d395171a52568378c2.tar.gz rneovim-8ab5ec4aaaeed27b1d8086d395171a52568378c2.tar.bz2 rneovim-8ab5ec4aaaeed27b1d8086d395171a52568378c2.zip |
feat(tree-sitter): allow Atom-style capture fallbacks (#14196)
This allows falling back to `@definition` when we have no mapping
`@definition.fancy-specialization`.
This behavior is described in tree-sitter's documentation
(https://tree-sitter.github.io/tree-sitter/syntax-highlighting#theme).
Fixes https://github.com/nvim-treesitter/nvim-treesitter/issues/738
Diffstat (limited to 'runtime/lua/vim/treesitter/highlighter.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/highlighter.lua | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua index 22b528838c..b6f61cfb2e 100644 --- a/runtime/lua/vim/treesitter/highlighter.lua +++ b/runtime/lua/vim/treesitter/highlighter.lua @@ -22,7 +22,21 @@ local _link_default_highlight_once = function(from, to) return from end -TSHighlighter.hl_map = { +-- If @definition.special does not exist use @definition instead +local subcapture_fallback = { + __index = function(self, capture) + local rtn + local shortened = capture + while not rtn and shortened do + shortened = shortened:match('(.*)%.') + rtn = shortened and rawget(self, shortened) + end + rawset(self, capture, rtn or "__notfound") + return rtn + end +} + +TSHighlighter.hl_map = setmetatable({ ["error"] = "Error", -- Miscs @@ -66,7 +80,7 @@ TSHighlighter.hl_map = { ["type.builtin"] = "Type", ["structure"] = "Structure", ["include"] = "Include", -} +}, subcapture_fallback) ---@private local function is_highlight_name(capture_name) |