aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2024-11-02 06:54:43 +0100
committerLuuk van Baal <luukvbaal@gmail.com>2024-11-07 13:12:30 +0100
commit59e130b6cacd71326ecc99ca180fd574abc8115c (patch)
treef02c39ba1c14ca5d3ce7f80c3deea37c43a05c34
parent3688a333544251c887d78e6501eec55f0fb685f8 (diff)
downloadrneovim-59e130b6cacd71326ecc99ca180fd574abc8115c.tar.gz
rneovim-59e130b6cacd71326ecc99ca180fd574abc8115c.tar.bz2
rneovim-59e130b6cacd71326ecc99ca180fd574abc8115c.zip
fix(inccommand): ensure cursor is where it belongs
Problem: Inccommand preview callback may flush inaccurate cmdline cursor position. Solution: Ensure cursor is where it belongs when doing command preview.
-rw-r--r--src/nvim/ex_getln.c3
-rw-r--r--test/functional/ui/inccommand_user_spec.lua33
2 files changed, 36 insertions, 0 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index 389e935557..dda1a18fa6 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -2550,6 +2550,9 @@ static bool cmdpreview_may_show(CommandLineState *s)
goto end;
}
+ // Cursor may be at the end of the message grid rather than at cmdspos.
+ // Place it there in case preview callback flushes it. #30696
+ cursorcmd();
// Flush now: external cmdline may itself wish to update the screen which is
// currently disallowed during cmdpreview(no longer needed in case that changes).
cmdline_ui_flush();
diff --git a/test/functional/ui/inccommand_user_spec.lua b/test/functional/ui/inccommand_user_spec.lua
index 12f3640b54..e8b546d33a 100644
--- a/test/functional/ui/inccommand_user_spec.lua
+++ b/test/functional/ui/inccommand_user_spec.lua
@@ -508,6 +508,39 @@ describe("'inccommand' for user commands", function()
feed(':Test')
eq('nosplit', api.nvim_get_option_value('inccommand', {}))
end)
+
+ it('does not flush intermediate cursor position at end of message grid', function()
+ exec_lua([[
+ vim.api.nvim_create_user_command('Test', function() end, {
+ nargs = '*',
+ preview = function(_, _, _)
+ vim.api.nvim_buf_set_text(0, 0, 0, 1, -1, { "Preview" })
+ vim.cmd.sleep("1m")
+ return 1
+ end
+ })
+ ]])
+ local cursor_goto = screen._handle_grid_cursor_goto
+ screen._handle_grid_cursor_goto = function(...)
+ cursor_goto(...)
+ assert(screen._cursor.col < 12)
+ end
+ feed(':Test baz<Left><Left>arb')
+ screen:expect({
+ grid = [[
+ Preview |
+ oh no, even more text |
+ will the text ever stop |
+ oh well |
+ did the text stop |
+ why won't it stop |
+ make the text stop |
+ |
+ {1:~ }|*8
+ :Test barb^az |
+ ]],
+ })
+ end)
end)
describe("'inccommand' with multiple buffers", function()