From ba9551d131d608b71155bacc0c4a65264f1f5f7c Mon Sep 17 00:00:00 2001 From: Girish Palya Date: Sat, 23 Aug 2025 18:08:27 +0200 Subject: [PATCH] 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 Signed-off-by: Christian Brabandt --- runtime/doc/autocmd.txt | 5 ++++- runtime/doc/eval.txt | 4 ++-- runtime/doc/version9.txt | 2 ++ src/ex_getln.c | 11 +++++++++++ src/proto/cmdexpand.pro | 2 +- src/testdir/test_cmdline.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 7 files changed, 41 insertions(+), 4 deletions(-) diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index d11cb1f185..f5ccae2147 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 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. , , ). *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 . 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 01ab14203e..c13e3a0b79 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 in an abbreviation |:map-|. - 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 1daf2f1912..b820717577 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 3f5f852a44..289231045c 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 a2f6a16d47..69e7da9be6 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 2ae27da7fa..3f8cb2d8fb 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 ["\", "\", "\"] + 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 a9f345547c..98ecbc99a8 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, /**/