fix(treesitter): do not modify highlight state for _on_spell_nav

Problem:  Treesitter highlighter clears the already populated highlight
          state when performing spell checking while drawing a
          smoothscrolled topline.
Solution: Save and restore the highlight state in the highlighter's
          _on_spell_nav callback.
This commit is contained in:
Luuk van Baal
2024-06-23 13:50:21 +02:00
committed by Lewis Russell
parent be999e6a0e
commit da4e8dc5b0
2 changed files with 41 additions and 28 deletions

View File

@ -377,11 +377,15 @@ function TSHighlighter._on_spell_nav(_, _, buf, srow, _, erow, _)
return
end
-- Do not affect potentially populated highlight state. Here we just want a temporary
-- empty state so the C code can detect whether the region should be spell checked.
local highlight_states = self._highlight_states
self:prepare_highlight_states(srow, erow)
for row = srow, erow do
on_line_impl(self, buf, row, true)
end
self._highlight_states = highlight_states
end
---@private

View File

@ -1008,39 +1008,48 @@ describe('treesitter highlighting (markdown)', function()
before_each(function()
screen = Screen.new(40, 6)
screen:attach()
screen:set_default_attr_ids {
[1] = { foreground = Screen.colors.Blue1 },
[2] = { bold = true, foreground = Screen.colors.Blue1 },
[3] = { bold = true, foreground = Screen.colors.Brown },
[4] = { foreground = Screen.colors.Cyan4 },
[5] = { foreground = Screen.colors.Magenta1 },
}
exec_lua([[
vim.bo.filetype = 'markdown'
vim.treesitter.start()
]])
end)
it('supports hyperlinks', function()
local url = 'https://example.com'
insert(string.format('[This link text](%s) is a hyperlink.', url))
exec_lua([[
vim.bo.filetype = 'markdown'
vim.treesitter.start()
]])
screen:expect {
screen:add_extra_attr_ids({
[100] = { foreground = Screen.colors.DarkCyan, url = 'https://example.com' },
})
screen:expect({
grid = [[
{4:[}{6:This link text}{4:](}{7:https://example.com}{4:)} is|
a hyperlink^. |
{2:~ }|*3
|
]],
attr_ids = {
[1] = { foreground = Screen.colors.Blue1 },
[2] = { bold = true, foreground = Screen.colors.Blue1 },
[3] = { bold = true, foreground = Screen.colors.Brown },
[4] = { foreground = Screen.colors.Cyan4 },
[5] = { foreground = Screen.colors.Magenta },
[6] = { foreground = Screen.colors.Cyan4, url = url },
[7] = { underline = true, foreground = Screen.colors.SlateBlue },
},
}
{25:[}{100:This link text}{25:](}{28:https://example.com}{25:)} is|
a hyperlink^. |
{1:~ }|*3
|
]],
})
end)
it('works with spellchecked and smoothscrolled topline', function()
insert([[
- $f(0)=\sum_{k=1}^{\infty}\frac{2}{\pi^{2}k^{2}}+\lim_{w \to 0}x$.
```c
printf('Hello World!');
```
]])
command('set spell smoothscroll')
feed('gg<C-E>')
screen:add_extra_attr_ids({ [100] = { undercurl = true, special = Screen.colors.Red } })
screen:expect({
grid = [[
{1:<<<}k^{2}}+\{100:lim}_{w \to 0}x$^. |
|
{18:```}{15:c} |
{25:printf}{16:(}{26:'Hello World!'}{16:);} |
{18:```} |
|
]],
})
end)
end)