|
@@ -0,0 +1,105 @@
|
|
|
+diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua
|
|
|
+index db4475e7e4..766f5f5416 100644
|
|
|
+--- a/runtime/lua/vim/treesitter/highlighter.lua
|
|
|
++++ b/runtime/lua/vim/treesitter/highlighter.lua
|
|
|
+@@ -52,11 +52,14 @@ function TSHighlighterQuery:query()
|
|
|
+ return self._query
|
|
|
+ end
|
|
|
+
|
|
|
++---@alias MarkInfo { start_line: integer, start_col: integer, opts: vim.api.keyset.set_extmark }
|
|
|
++
|
|
|
+ ---@class (private) vim.treesitter.highlighter.State
|
|
|
+ ---@field tstree TSTree
|
|
|
+ ---@field next_row integer
|
|
|
+ ---@field iter vim.treesitter.highlighter.Iter?
|
|
|
+ ---@field highlighter_query vim.treesitter.highlighter.Query
|
|
|
++---@field prev_marks MarkInfo[]
|
|
|
+
|
|
|
+ ---@nodoc
|
|
|
+ ---@class vim.treesitter.highlighter
|
|
|
+@@ -220,6 +223,7 @@ function TSHighlighter:prepare_highlight_states(win, srow, erow)
|
|
|
+ next_row = 0,
|
|
|
+ iter = nil,
|
|
|
+ highlighter_query = hl_query,
|
|
|
++ prev_marks = {},
|
|
|
+ })
|
|
|
+ end)
|
|
|
+ end
|
|
|
+@@ -311,6 +315,35 @@ local function get_spell(capture_name)
|
|
|
+ return nil, 0
|
|
|
+ end
|
|
|
+
|
|
|
++---Adds the mark to the buffer, clipped by the line.
|
|
|
++---Queues the remainder if the mark continues after the line.
|
|
|
++---@param m MarkInfo
|
|
|
++---@param buf integer
|
|
|
++---@param line integer
|
|
|
++---@param next_marks MarkInfo[]
|
|
|
++local function add_mark(m, buf, line, next_marks)
|
|
|
++ local cur_start_l = m.start_line
|
|
|
++ local cur_start_c = m.start_col
|
|
|
++ if cur_start_l < line then
|
|
|
++ cur_start_l = line
|
|
|
++ cur_start_c = 0
|
|
|
++ end
|
|
|
++
|
|
|
++ local cur_opts = m.opts
|
|
|
++ if cur_opts.end_line >= line + 1 then
|
|
|
++ cur_opts = vim.deepcopy(cur_opts, true)
|
|
|
++ cur_opts.end_line = line + 1
|
|
|
++ cur_opts.end_col = 0
|
|
|
++ table.insert(next_marks, m)
|
|
|
++ end
|
|
|
++
|
|
|
++ local empty = cur_opts.end_line < cur_start_l
|
|
|
++ or (cur_opts.end_line == cur_start_l and cur_opts.end_col <= cur_start_c)
|
|
|
++ if cur_start_l <= line and not empty then
|
|
|
++ api.nvim_buf_set_extmark(buf, ns, cur_start_l, cur_start_c, cur_opts)
|
|
|
++ end
|
|
|
++end
|
|
|
++
|
|
|
+ ---@param self vim.treesitter.highlighter
|
|
|
+ ---@param win integer
|
|
|
+ ---@param buf integer
|
|
|
+@@ -328,6 +361,12 @@ local function on_line_impl(self, win, buf, line, on_spell, on_conceal)
|
|
|
+ return
|
|
|
+ end
|
|
|
+
|
|
|
++ local next_marks = {}
|
|
|
++
|
|
|
++ for _, mark in ipairs(state.prev_marks) do
|
|
|
++ add_mark(mark, buf, line, next_marks)
|
|
|
++ end
|
|
|
++
|
|
|
+ if state.iter == nil or state.next_row < line then
|
|
|
+ -- Mainly used to skip over folds
|
|
|
+
|
|
|
+@@ -367,7 +406,7 @@ local function on_line_impl(self, win, buf, line, on_spell, on_conceal)
|
|
|
+ local url = get_url(match, buf, capture, metadata)
|
|
|
+
|
|
|
+ if hl and end_row >= line and not on_conceal and (not on_spell or spell ~= nil) then
|
|
|
+- api.nvim_buf_set_extmark(buf, ns, start_row, start_col, {
|
|
|
++ local opts = {
|
|
|
+ end_line = end_row,
|
|
|
+ end_col = end_col,
|
|
|
+ hl_group = hl,
|
|
|
+@@ -376,7 +415,9 @@ local function on_line_impl(self, win, buf, line, on_spell, on_conceal)
|
|
|
+ conceal = conceal,
|
|
|
+ spell = spell,
|
|
|
+ url = url,
|
|
|
+- })
|
|
|
++ }
|
|
|
++ local mark = { start_line = start_row, start_col = start_col, opts = opts }
|
|
|
++ add_mark(mark, buf, line, next_marks)
|
|
|
+ end
|
|
|
+
|
|
|
+ if
|
|
|
+@@ -395,6 +436,8 @@ local function on_line_impl(self, win, buf, line, on_spell, on_conceal)
|
|
|
+ state.next_row = start_row
|
|
|
+ end
|
|
|
+ end
|
|
|
++
|
|
|
++ state.prev_marks = next_marks
|
|
|
+ end)
|
|
|
+ end
|
|
|
+
|