1
0
forked from aniani/vim

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 <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq 2024-06-21 07:51:40 +02:00 committed by Christian Brabandt
parent 17e0a1969d
commit bc6f96708e
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
4 changed files with 31 additions and 20 deletions

View File

@ -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.
<afile> is set to a single character,
indicating the type of command-line.

View File

@ -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;
}

View File

@ -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\<Left>\<ESC>", 'xt')
call assert_equal(5, g:pos)
call feedkeys(":12345678\<C-R>=setcmdpos(3)\<CR>\<ESC>", 'xt')
call assert_equal(3, g:pos)
au! CursorMovedC : let g:pos += [getcmdpos()]
let g:pos = []
call feedkeys(":hello\<Left>\<C-R>=''\<CR>\<Left>\<Right>\<Esc>", 'xt')
call assert_equal([5, 4, 5], g:pos)
let g:pos = []
call feedkeys(":12345678\<C-R>=setcmdpos(3)??''\<CR>\<Esc>", 'xt')
call assert_equal([3], g:pos)
let g:pos = []
call feedkeys(":12345678\<C-R>=setcmdpos(3)??''\<CR>\<Left>\<Esc>", '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\<Left>\<ESC>", '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\<Left>\<Left>\<Esc>", '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.

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
511,
/**/
510,
/**/