From bc6f96708e3678dbb27ec4192d87cf94a15d4e9a Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 21 Jun 2024 07:51:40 +0200 Subject: [PATCH] patch 9.1.0511: CursorMovedC triggered wrongly with setcmdpos() Problem: CursorMovedC triggered wrongly with setcmdpos() (after v9.1.0507) Solution: Remove the premature triggering. Also don't trigger when cursor didn't move. (zeertzjq) closes: #15064 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- runtime/doc/autocmd.txt | 5 +++-- src/ex_getln.c | 14 +++++++------- src/testdir/test_autocmd.vim | 30 +++++++++++++++++++----------- src/version.c | 2 ++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index 27ab2c73c5..e19d6015e8 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 9.1. Last change: 2024 Jun 20 +*autocmd.txt* For Vim version 9.1. Last change: 2024 Jun 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -751,7 +751,8 @@ CursorMoved After the cursor was moved in Normal or Visual that is slow. *CursorMovedC* CursorMovedC After the cursor was moved in the command - line. Be careful not to mess up the + line while the text in the command line hasn't + changed. Be careful not to mess up the command line, it may cause Vim to lock up. is set to a single character, indicating the type of command-line. diff --git a/src/ex_getln.c b/src/ex_getln.c index 481b450dc1..f05259bb9d 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1586,7 +1586,7 @@ getcmdline_int( int res; int save_msg_scroll = msg_scroll; int save_State = State; // remember State when called - int save_cmdspos = ccline.cmdspos; + int prev_cmdpos = -1; int some_key_typed = FALSE; // one of the keys was typed // mouse drag and release events are ignored, unless they are // preceded with a mouse down event @@ -2474,16 +2474,19 @@ getcmdline_int( * (Sorry for the goto's, I know it is ugly). */ cmdline_not_changed: - // Trigger CursorMovedC autocommands. - if (ccline.cmdspos != save_cmdspos) + // Trigger CursorMovedC autocommands. + if (ccline.cmdpos != prev_cmdpos) + { trigger_cmd_autocmd(cmdline_type, EVENT_CURSORMOVEDC); - + prev_cmdpos = ccline.cmdpos; + } #ifdef FEAT_SEARCH_EXTRA if (!is_state.incsearch_postponed) continue; #endif cmdline_changed: + prev_cmdpos = ccline.cmdpos; #ifdef FEAT_SEARCH_EXTRA // If the window changed incremental search state is not valid. if (is_state.winid != curwin->w_id) @@ -4321,9 +4324,6 @@ set_cmdline_pos( else new_cmdpos = pos; - // Trigger CursorMovedC autocommands. - trigger_cmd_autocmd(get_cmdline_type(), EVENT_CURSORMOVEDC); - return 0; } diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index faa0f9771c..371abcbd75 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -2097,20 +2097,28 @@ func Test_Cmdline() au! CmdlineLeave let &shellslash = save_shellslash - au! CursorMovedC : let g:pos = getcmdpos() - let g:pos = 0 - call feedkeys(":hello\\", 'xt') - call assert_equal(5, g:pos) - call feedkeys(":12345678\=setcmdpos(3)\\", 'xt') - call assert_equal(3, g:pos) + au! CursorMovedC : let g:pos += [getcmdpos()] + let g:pos = [] + call feedkeys(":hello\\=''\\\\", 'xt') + call assert_equal([5, 4, 5], g:pos) + let g:pos = [] + call feedkeys(":12345678\=setcmdpos(3)??''\\", 'xt') + call assert_equal([3], g:pos) + let g:pos = [] + call feedkeys(":12345678\=setcmdpos(3)??''\\\", 'xt') + call assert_equal([3, 2], g:pos) au! CursorMovedC - " CursorMovedC changes the cursor position. - au! CursorMovedC : let g:pos = getcmdpos() | call setcmdpos(getcmdpos()-1) - let g:pos = 0 - call feedkeys(":hello\\", 'xt') - call assert_equal(5, g:pos) + " setcmdpos() is no-op inside an autocommand + au! CursorMovedC : let g:pos += [getcmdpos()] | call setcmdpos(1) + let g:pos = [] + call feedkeys(":hello\\\", 'xt') + call assert_equal([5, 4], g:pos) au! CursorMovedC + + unlet g:entered + unlet g:left + unlet g:pos endfunc " Test for BufWritePre autocommand that deletes or unloads the buffer. diff --git a/src/version.c b/src/version.c index f856876e3f..e0b0d5ccf3 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 511, /**/ 510, /**/