diff options
-rw-r--r-- | runtime/doc/autocmd.txt | 10 | ||||
-rw-r--r-- | runtime/doc/tags | 1 | ||||
-rw-r--r-- | runtime/doc/version9.txt | 3 | ||||
-rw-r--r-- | src/autocmd.c | 2 | ||||
-rw-r--r-- | src/ex_getln.c | 11 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
8 files changed, 42 insertions, 3 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index 037f89c4c7..27ab2c73c5 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 May 05 +*autocmd.txt* For Vim version 9.1. Last change: 2024 Jun 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -379,6 +379,7 @@ Name triggered by ~ |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 |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 |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 do anything that the user does not expect or 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 After the cursor was moved in Insert mode. Not triggered when the popup menu is visible. diff --git a/runtime/doc/tags b/runtime/doc/tags index ae8320520a..4dd25ba21c 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4063,6 +4063,7 @@ CursorHold-example windows.txt /*CursorHold-example* CursorHoldI autocmd.txt /*CursorHoldI* CursorIM mbyte.txt /*CursorIM* CursorMoved autocmd.txt /*CursorMoved* +CursorMovedC autocmd.txt /*CursorMovedC* CursorMovedI autocmd.txt /*CursorMovedI* D change.txt /*D* DOS os_dos.txt /*DOS* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index e33b8fa70f..d50e0e8fa1 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -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 @@ -41591,6 +41591,7 @@ Functions: ~ Autocommands: ~ +|CursorMovedC| after the cursor was moved in the comamnd-line |SessionWritePost| after writing the session file |:mksession| |TermResponseAll| after the terminal response to |t_RV| and others is received diff --git a/src/autocmd.c b/src/autocmd.c index 8380f8a04e..e60eac794d 100644 --- a/src/autocmd.c +++ b/src/autocmd.c @@ -120,6 +120,7 @@ static keyvalue_T event_tab[] = { KEYVALUE_ENTRY(EVENT_CURSORHOLD, "CursorHold"), KEYVALUE_ENTRY(EVENT_CURSORHOLDI, "CursorHoldI"), KEYVALUE_ENTRY(EVENT_CURSORMOVED, "CursorMoved"), + KEYVALUE_ENTRY(EVENT_CURSORMOVEDC, "CursorMovedC"), KEYVALUE_ENTRY(EVENT_CURSORMOVEDI, "CursorMovedI"), KEYVALUE_ENTRY(EVENT_DIFFUPDATED, "DiffUpdated"), KEYVALUE_ENTRY(EVENT_DIRCHANGED, "DirChanged"), @@ -2250,6 +2251,7 @@ apply_autocmds_group( || event == EVENT_CMDLINECHANGED || event == EVENT_CMDLINEENTER || event == EVENT_CMDLINELEAVE + || event == EVENT_CURSORMOVEDC || event == EVENT_CMDWINENTER || event == EVENT_CMDWINLEAVE || event == EVENT_CMDUNDEFINED diff --git a/src/ex_getln.c b/src/ex_getln.c index 3444a0e86e..481b450dc1 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1586,6 +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 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 @@ -2473,6 +2474,10 @@ getcmdline_int( * (Sorry for the goto's, I know it is ugly). */ cmdline_not_changed: + // Trigger CursorMovedC autocommands. + if (ccline.cmdspos != save_cmdspos) + trigger_cmd_autocmd(cmdline_type, EVENT_CURSORMOVEDC); + #ifdef FEAT_SEARCH_EXTRA if (!is_state.incsearch_postponed) continue; @@ -2484,8 +2489,8 @@ cmdline_changed: if (is_state.winid != curwin->w_id) init_incsearch_state(&is_state); #endif + // Trigger CmdlineChanged autocommands. if (trigger_cmdlinechanged) - // Trigger CmdlineChanged autocommands. trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED); #ifdef FEAT_SEARCH_EXTRA @@ -4315,6 +4320,10 @@ set_cmdline_pos( new_cmdpos = 0; 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 c9f257a87c..faa0f9771c 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -2096,6 +2096,21 @@ func Test_Cmdline() au! CmdlineEnter 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 + + " 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 " Test for BufWritePre autocommand that deletes or unloads the buffer. diff --git a/src/version.c b/src/version.c index 9d40d8fde8..da82b3683f 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 507, +/**/ 506, /**/ 505, @@ -1361,6 +1361,7 @@ enum auto_event EVENT_CURSORHOLD, // cursor in same position for a while EVENT_CURSORHOLDI, // idem, in Insert mode EVENT_CURSORMOVED, // cursor was moved + EVENT_CURSORMOVEDC, // cursor was moved in Command line mode EVENT_CURSORMOVEDI, // cursor was moved in Insert mode EVENT_DIFFUPDATED, // after diffs were updated EVENT_DIRCHANGED, // after user changed directory |