neovim

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

commit af0f7b59b1fcd92e64841cb5da8a577e944ce5bb
parent 323d5527eed6a7c75e795570431a3292b92c1148
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Thu, 23 Oct 2025 11:27:23 +0800

fix(statusline): redraw if Visual selection other end changes (#36281)


Diffstat:
Msrc/nvim/buffer_defs.h | 1+
Msrc/nvim/drawscreen.c | 6+++++-
Mtest/functional/ui/statusline_spec.lua | 22++++++++++++++++++++++
3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h @@ -1295,6 +1295,7 @@ struct window_S { int w_stl_recording; // reg_recording when last redrawn int w_stl_state; // get_real_state() when last redrawn int w_stl_visual_mode; // VIsual_mode when last redrawn + pos_T w_stl_visual_pos; // VIsual when last redrawn int w_alt_fnum; // alternate file (for # and CTRL-^) diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c @@ -810,7 +810,10 @@ void show_cursor_info_later(bool force) || empty_line != curwin->w_stl_empty || reg_recording != curwin->w_stl_recording || state != curwin->w_stl_state - || (VIsual_active && VIsual_mode != curwin->w_stl_visual_mode)) { + || (VIsual_active && (VIsual_mode != curwin->w_stl_visual_mode + || VIsual.lnum != curwin->w_stl_visual_pos.lnum + || VIsual.col != curwin->w_stl_visual_pos.col + || VIsual.coladd != curwin->w_stl_visual_pos.coladd))) { if (curwin->w_status_height || global_stl_height()) { curwin->w_redr_status = true; } else { @@ -834,6 +837,7 @@ void show_cursor_info_later(bool force) curwin->w_stl_state = state; if (VIsual_active) { curwin->w_stl_visual_mode = VIsual_mode; + curwin->w_stl_visual_pos = VIsual; } } diff --git a/test/functional/ui/statusline_spec.lua b/test/functional/ui/statusline_spec.lua @@ -656,6 +656,28 @@ describe('statusline', function() ]]) feed('<Esc>') screen:expect(s2) + + -- Visual selection other end change #36280 + exec([[ + function! DebugVisualSelection() + return printf("v %s %s", col("v"), col(".")) + endfunction + set statusline=%!DebugVisualSelection() + ]]) + feed('iabc<Esc>v') + screen:expect([[ + ab^c | + {1:~ }|*5 + {3:v 3 3 }| + {5:-- VISUAL --} | + ]]) + feed('iw') + screen:expect([[ + {17:ab}^c | + {1:~ }|*5 + {3:v 1 3 }| + {5:-- VISUAL --} | + ]]) end) it('ruler is redrawn in cmdline with redrawstatus #22804', function()