patch 9.1.1679: unclear what key causes CmdlineLeave autocommand
Commit:
https://github.com/vim/vim/commit/ba9551d131d608b71155bacc0c4a65264f1f5f7c
Author: Girish Palya <
giri...@gmail.com>
Date: Sat Aug 23 18:08:27 2025 +0200
patch 9.1.1679: unclear what key causes CmdlineLeave autocommand
Problem: unclear what key causes CmdlineLeave autocommand
Solution: Set |v:char| to the key (Girish Palya).
related: #17806
closes: #18063
Signed-off-by: Girish Palya <
giri...@gmail.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index d11cb1f18..f5ccae214 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt* For Vim version 9.1. Last change: 2025 Jun 19
+*autocmd.txt* For Vim version 9.1. Last change: 2025 Aug 23
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -644,6 +644,8 @@ CmdlineLeave Before leaving the command line; including
<afile> is set to a single character,
indicating the type of command-line.
|cmdwin-char|
+ Sets the |v:char| to the key that exited the
+ command-line (e.g. <CR>, <CTRL-C>, <Esc>).
*CmdlineLeavePre*
CmdlineLeavePre Just before leaving the command line, and
before |CmdlineLeave|. Useful for capturing
@@ -656,6 +658,7 @@ CmdlineLeavePre Just before leaving the command line, and
or <Esc>. <afile> is set to a single
character indicating the command-line type.
See |cmdwin-char| for details.
+ Sets |v:char| as with |CmdlineLeave|.
*CmdwinEnter*
CmdwinEnter After entering the command-line window.
Useful for setting options specifically for
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 01ab14203..c13e3a0b7 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2227,8 +2227,8 @@ v:beval_winid The |window-ID| of the window, over which the mouse pointer
*v:char* *char-variable*
v:char Argument for evaluating 'formatexpr' and used for the typed
character when using <expr> in an abbreviation |:map-<expr>|.
- It is also used by the |InsertCharPre|, |InsertEnter| and
- |KeyInputPre| events.
+ It is also used by the |InsertCharPre|, |InsertEnter|,
+ |KeyInputPre|, |CmdlineLeave| and |CmdlineLeavePre| events.
*v:charconvert_from* *charconvert_from-variable*
v:charconvert_from
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index 1daf2f191..b82071757 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -41750,6 +41750,8 @@ Others: ~
ANGLE BRACKET "]>".
- Support for Unix domain sockets have been added for the clientserver
feature, see |socketserver-clientserver|.
+- |CmdlineLeave| sets |v:char| to the character that caused exiting the
+ Command-line.
Platform specific ~
- MS-Winodws: Paths like "\Windows" and "/Windows" are now considered to be
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 3f5f852a4..289231045 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1980,6 +1980,9 @@ getcmdline_int(
#endif
|| c == Ctrl_C))
{
+#ifdef FEAT_EVAL
+ set_vim_var_char(c); // Set v:char
+#endif
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVEPRE);
event_cmdlineleavepre_triggered = TRUE;
#if defined(FEAT_SEARCH_EXTRA) || defined(PROTO)
@@ -2646,7 +2649,12 @@ cmdline_changed:
returncmd:
// Trigger CmdlineLeavePre autocommands if not already triggered.
if (!event_cmdlineleavepre_triggered)
+ {
+#ifdef FEAT_EVAL
+ set_vim_var_char(c); // Set v:char
+#endif
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVEPRE);
+ }
#ifdef FEAT_RIGHTLEFT
cmdmsg_rl = FALSE;
@@ -2704,6 +2712,9 @@ returncmd:
need_wait_return = FALSE;
// Trigger CmdlineLeave autocommands.
+#ifdef FEAT_EVAL
+ set_vim_var_char(c); // Set v:char
+#endif
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVE);
State = save_State;
diff --git a/src/proto/
cmdexpand.pro b/src/proto/
cmdexpand.pro
index a2f6a16d4..69e7da9be 100644
--- a/src/proto/
cmdexpand.pro
+++ b/src/proto/
cmdexpand.pro
@@ -25,5 +25,5 @@ int wildmenu_process_key(cmdline_info_T *cclp, int key, expand_T *xp);
void wildmenu_cleanup(cmdline_info_T *cclp);
void f_getcompletion(typval_T *argvars, typval_T *rettv);
void f_getcompletiontype(typval_T *argvars, typval_T *rettv);
-void f_cmdcomplete_info(typval_T *argvars, typval_T *rettv);
+void f_cmdcomplete_info(typval_T *argvars UNUSED, typval_T *rettv);
/* vim: set ft=c : */
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 2ae27da7f..3f8cb2d8f 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -4918,4 +4918,23 @@ func Test_long_line_noselect()
call StopVimInTerminal(buf)
endfunc
+func Test_CmdlineLeave_vchar_keys()
+ func OnLeave()
+ let g:leave_key = v:char
+ endfunction
+
+ new
+ for event in ["CmdlineLeavePre", "CmdlineLeave"]
+ exec "autocmd" event "* :call OnLeave()"
+ for key in ["\<C-C>", "\<Esc>", "\<CR>"]
+ call feedkeys($":echo{key}", 'tx')
+ call assert_equal(key, g:leave_key)
+ endfor
+ exec "autocmd!" event
+ endfor
+ bwipe!
+ delfunc OnLeave
+ unlet g:leave_key
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index a9f345547..98ecbc99a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1679,
/**/
1678,
/**/