neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 235cb5bc5f2553f5a46807267b8705e53f7a14af
parent e025f5a5b30a1ef92e88fed0f0c548d2240d30c0
Author: luukvbaal <luukvbaal@gmail.com>
Date:   Sun, 17 Nov 2024 20:43:36 +0100

fix(api): update "range" windows in nvim__redraw #31042

Problem:  nvim__redraw's "range" marks a buffer range for redraw, and subsequently
          flushes the UI without updating the windows containing that buffer.
Solution: Implicitly update the screen, unless specified otherwise.
          Only update the screen with the last call of the treesitter
          on_changedtree() callback.
Diffstat:
Mruntime/lua/vim/treesitter/highlighter.lua | 4++--
Msrc/nvim/api/vim.c | 12++++++------
2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua @@ -219,8 +219,8 @@ end ---@package ---@param changes Range6[] function TSHighlighter:on_changedtree(changes) - for _, ch in ipairs(changes) do - api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 } }) + for i, ch in ipairs(changes) do + api.nvim__redraw({ buf = self.bufnr, range = { ch[1], ch[4] + 1 }, flush = i == #changes }) end end diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c @@ -2396,13 +2396,13 @@ void nvim__redraw(Dict(redraw) *opts, Error *err) last = rbuf->b_ml.ml_line_count; } redraw_buf_range_later(rbuf, first, last); + opts->flush = HAS_KEY(opts, redraw, flush) ? opts->flush : true; } - bool flush = opts->flush; if (opts->tabline) { // Flush later in case tabline was just hidden or shown for the first time. if (redraw_tabline && firstwin->w_lines_valid == 0) { - flush = true; + opts->flush = true; } else { draw_tabline(); } @@ -2416,23 +2416,23 @@ void nvim__redraw(Dict(redraw) *opts, Error *err) if (win == NULL) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { if (buf == NULL || wp->w_buffer == buf) { - redraw_status(wp, opts, &flush); + redraw_status(wp, opts, &opts->flush); } } } else { - redraw_status(win, opts, &flush); + redraw_status(win, opts, &opts->flush); } } win_T *cwin = win ? win : curwin; // Allow moving cursor to recently opened window and make sure it is drawn #28868. if (opts->cursor && (!cwin->w_grid.target || !cwin->w_grid.target->valid)) { - flush = true; + opts->flush = true; } // Redraw pending screen updates when explicitly requested or when determined // that it is necessary to properly draw other requested components. - if (flush && !cmdpreview) { + if (opts->flush && !cmdpreview) { update_screen(); }