Pārlūkot izejas kodu

nixpkgs/neovim: add patch for treesitter highlighter error

Thomas Dy 2 nedēļas atpakaļ
vecāks
revīzija
864f586aa0

+ 2 - 0
.config/nixpkgs/neovim/flake.nix

@@ -20,6 +20,8 @@
             blink-cmp = blink-cmp.packages.${system}.blink-cmp;
             neovim-unwrapped = prev.neovim-unwrapped.overrideAttrs (attrs: attrs // {
               patches = (attrs.patches or []) ++ [
+                # fix occasional treesitter highlighter error when deleting lines
+                ./neovim-32619.patch
                 # fix floating windows not closing when going to another file
                 ./neovim-34946.patch
               ];

+ 105 - 0
.config/nixpkgs/neovim/neovim-32619.patch

@@ -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
+