summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShougo Matsushita <Shougo.Matsu@gmail.com>2024-06-20 22:05:16 +0200
committerChristian Brabandt <cb@256bit.org>2024-06-20 22:05:16 +0200
commitd09521476f41dd8dbddb25b7acd0b299f9bf94d3 (patch)
treee0228de6da48415951831957367a96b7aff07636
parentbeb02ed674bc61f179c4ff71e93bdeeb44fe9c4e (diff)
patch 9.1.0507: hard to detect cursor movement in the command linev9.1.0507
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>
-rw-r--r--runtime/doc/autocmd.txt10
-rw-r--r--runtime/doc/tags1
-rw-r--r--runtime/doc/version9.txt3
-rw-r--r--src/autocmd.c2
-rw-r--r--src/ex_getln.c11
-rw-r--r--src/testdir/test_autocmd.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
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,
diff --git a/src/vim.h b/src/vim.h
index e703239371..a80f844848 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -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