mirror of
https://github.com/neovim/neovim
synced 2025-07-15 16:51:49 +00:00
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:
committed by
Lewis Russell
parent
be999e6a0e
commit
da4e8dc5b0
@ -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
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user