Skip to content

Commit

Permalink
fix(treesitter): do not modify highlight state for _on_spell_nav
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
luukvbaal authored and lewis6991 committed Jun 24, 2024
1 parent be999e6 commit da4e8dc
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 27 deletions.
4 changes: 4 additions & 0 deletions runtime/lua/vim/treesitter/highlighter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
63 changes: 36 additions & 27 deletions test/functional/treesitter/highlight_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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:add_extra_attr_ids({
[100] = { foreground = Screen.colors.DarkCyan, url = 'https://example.com' },
})
screen:expect({
grid = [[
{25:[}{100:This link text}{25:](}{28:https://example.com}{25:)} is|
a hyperlink^. |
{1:~ }|*3
|
]],
})
end)

screen:expect {
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 = [[
{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 },
},
}
{1:<<<}k^{2}}+\{100:lim}_{w \to 0}x$^. |
|
{18:```}{15:c} |
{25:printf}{16:(}{26:'Hello World!'}{16:);} |
{18:```} |
|
]],
})
end)
end)

0 comments on commit da4e8dc

Please sign in to comment.