0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.1.0507: hard to detect cursor movement in the command line

Problem:  hard to detect cursor movement in the command line
Solution: Add the CursorMovedC autocommand
          (Shougo Matsushita)

closes: #15040

Signed-off-by: Shougo Matsushita <Shougo.Matsu@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Shougo Matsushita
2024-06-20 22:05:16 +02:00
committed by Christian Brabandt
parent beb02ed674
commit d09521476f
8 changed files with 42 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
*autocmd.txt* For Vim version 9.1. Last change: 2024 May 05 *autocmd.txt* For Vim version 9.1. Last change: 2024 Jun 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -379,6 +379,7 @@ Name triggered by ~
|CursorHold| the user doesn't press a key for a while |CursorHold| the user doesn't press a key for a while
|CursorHoldI| the user doesn't press a key for a while in Insert mode |CursorHoldI| the user doesn't press a key for a while in Insert mode
|CursorMoved| the cursor was moved in Normal mode |CursorMoved| the cursor was moved in Normal mode
|CursorMovedC| the cursor was moved in the |Command-line|
|CursorMovedI| the cursor was moved in Insert mode |CursorMovedI| the cursor was moved in Insert mode
|WinNewPre| before creating a new window |WinNewPre| before creating a new window
@@ -748,6 +749,13 @@ CursorMoved After the cursor was moved in Normal or Visual
Careful: This is triggered very often, don't Careful: This is triggered very often, don't
do anything that the user does not expect or do anything that the user does not expect or
that is slow. that is slow.
*CursorMovedC*
CursorMovedC After the cursor was moved in the command
line. 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.
|cmdwin-char|
*CursorMovedI* *CursorMovedI*
CursorMovedI After the cursor was moved in Insert mode. CursorMovedI After the cursor was moved in Insert mode.
Not triggered when the popup menu is visible. Not triggered when the popup menu is visible.

View File

@@ -4063,6 +4063,7 @@ CursorHold-example windows.txt /*CursorHold-example*
CursorHoldI autocmd.txt /*CursorHoldI* CursorHoldI autocmd.txt /*CursorHoldI*
CursorIM mbyte.txt /*CursorIM* CursorIM mbyte.txt /*CursorIM*
CursorMoved autocmd.txt /*CursorMoved* CursorMoved autocmd.txt /*CursorMoved*
CursorMovedC autocmd.txt /*CursorMovedC*
CursorMovedI autocmd.txt /*CursorMovedI* CursorMovedI autocmd.txt /*CursorMovedI*
D change.txt /*D* D change.txt /*D*
DOS os_dos.txt /*DOS* DOS os_dos.txt /*DOS*

View File

@@ -1,4 +1,4 @@
*version9.txt* For Vim version 9.1. Last change: 2024 Jun 19 *version9.txt* For Vim version 9.1. Last change: 2024 Jun 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -41591,6 +41591,7 @@ Functions: ~
Autocommands: ~ Autocommands: ~
|CursorMovedC| after the cursor was moved in the comamnd-line
|SessionWritePost| after writing the session file |:mksession| |SessionWritePost| after writing the session file |:mksession|
|TermResponseAll| after the terminal response to |t_RV| and others is |TermResponseAll| after the terminal response to |t_RV| and others is
received received

View File

@@ -120,6 +120,7 @@ static keyvalue_T event_tab[] = {
KEYVALUE_ENTRY(EVENT_CURSORHOLD, "CursorHold"), KEYVALUE_ENTRY(EVENT_CURSORHOLD, "CursorHold"),
KEYVALUE_ENTRY(EVENT_CURSORHOLDI, "CursorHoldI"), KEYVALUE_ENTRY(EVENT_CURSORHOLDI, "CursorHoldI"),
KEYVALUE_ENTRY(EVENT_CURSORMOVED, "CursorMoved"), KEYVALUE_ENTRY(EVENT_CURSORMOVED, "CursorMoved"),
KEYVALUE_ENTRY(EVENT_CURSORMOVEDC, "CursorMovedC"),
KEYVALUE_ENTRY(EVENT_CURSORMOVEDI, "CursorMovedI"), KEYVALUE_ENTRY(EVENT_CURSORMOVEDI, "CursorMovedI"),
KEYVALUE_ENTRY(EVENT_DIFFUPDATED, "DiffUpdated"), KEYVALUE_ENTRY(EVENT_DIFFUPDATED, "DiffUpdated"),
KEYVALUE_ENTRY(EVENT_DIRCHANGED, "DirChanged"), KEYVALUE_ENTRY(EVENT_DIRCHANGED, "DirChanged"),
@@ -2250,6 +2251,7 @@ apply_autocmds_group(
|| event == EVENT_CMDLINECHANGED || event == EVENT_CMDLINECHANGED
|| event == EVENT_CMDLINEENTER || event == EVENT_CMDLINEENTER
|| event == EVENT_CMDLINELEAVE || event == EVENT_CMDLINELEAVE
|| event == EVENT_CURSORMOVEDC
|| event == EVENT_CMDWINENTER || event == EVENT_CMDWINENTER
|| event == EVENT_CMDWINLEAVE || event == EVENT_CMDWINLEAVE
|| event == EVENT_CMDUNDEFINED || event == EVENT_CMDUNDEFINED

View File

@@ -1586,6 +1586,7 @@ getcmdline_int(
int res; int res;
int save_msg_scroll = msg_scroll; int save_msg_scroll = msg_scroll;
int save_State = State; // remember State when called int save_State = State; // remember State when called
int save_cmdspos = ccline.cmdspos;
int some_key_typed = FALSE; // one of the keys was typed int some_key_typed = FALSE; // one of the keys was typed
// mouse drag and release events are ignored, unless they are // mouse drag and release events are ignored, unless they are
// preceded with a mouse down event // preceded with a mouse down event
@@ -2473,6 +2474,10 @@ getcmdline_int(
* (Sorry for the goto's, I know it is ugly). * (Sorry for the goto's, I know it is ugly).
*/ */
cmdline_not_changed: cmdline_not_changed:
// Trigger CursorMovedC autocommands.
if (ccline.cmdspos != save_cmdspos)
trigger_cmd_autocmd(cmdline_type, EVENT_CURSORMOVEDC);
#ifdef FEAT_SEARCH_EXTRA #ifdef FEAT_SEARCH_EXTRA
if (!is_state.incsearch_postponed) if (!is_state.incsearch_postponed)
continue; continue;
@@ -2484,8 +2489,8 @@ cmdline_changed:
if (is_state.winid != curwin->w_id) if (is_state.winid != curwin->w_id)
init_incsearch_state(&is_state); init_incsearch_state(&is_state);
#endif #endif
if (trigger_cmdlinechanged)
// Trigger CmdlineChanged autocommands. // Trigger CmdlineChanged autocommands.
if (trigger_cmdlinechanged)
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED); trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
#ifdef FEAT_SEARCH_EXTRA #ifdef FEAT_SEARCH_EXTRA
@@ -4315,6 +4320,10 @@ set_cmdline_pos(
new_cmdpos = 0; new_cmdpos = 0;
else else
new_cmdpos = pos; new_cmdpos = pos;
// Trigger CursorMovedC autocommands.
trigger_cmd_autocmd(get_cmdline_type(), EVENT_CURSORMOVEDC);
return 0; return 0;
} }

View File

@@ -2096,6 +2096,21 @@ func Test_Cmdline()
au! CmdlineEnter au! CmdlineEnter
au! CmdlineLeave au! CmdlineLeave
let &shellslash = save_shellslash 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
" 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)
au! CursorMovedC
endfunc endfunc
" Test for BufWritePre autocommand that deletes or unloads the buffer. " Test for BufWritePre autocommand that deletes or unloads the buffer.

View File

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

View File

@@ -1361,6 +1361,7 @@ enum auto_event
EVENT_CURSORHOLD, // cursor in same position for a while EVENT_CURSORHOLD, // cursor in same position for a while
EVENT_CURSORHOLDI, // idem, in Insert mode EVENT_CURSORHOLDI, // idem, in Insert mode
EVENT_CURSORMOVED, // cursor was moved EVENT_CURSORMOVED, // cursor was moved
EVENT_CURSORMOVEDC, // cursor was moved in Command line mode
EVENT_CURSORMOVEDI, // cursor was moved in Insert mode EVENT_CURSORMOVEDI, // cursor was moved in Insert mode
EVENT_DIFFUPDATED, // after diffs were updated EVENT_DIFFUPDATED, // after diffs were updated
EVENT_DIRCHANGED, // after user changed directory EVENT_DIRCHANGED, // after user changed directory