changeset 35735:ef68d7d8658a v9.1.0597

patch 9.1.0597: KeyInputPre cannot get the (unmapped typed) key Commit: https://github.com/vim/vim/commit/fcc1b5741e391c163c9ce979653987c83287ce20 Author: Shougo Matsushita <Shougo.Matsu@gmail.com> Date: Wed Jul 17 20:25:22 2024 +0200 patch 9.1.0597: KeyInputPre cannot get the (unmapped typed) key Problem: KeyInputPre cannot get the (unmapped typed) key (after v9.1.0563) Solution: Add the "typedchar" property to the v:event dict (Shougo Matsushita) closes: #15231 Co-authored-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Shougo Matsushita <Shougo.Matsu@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Wed, 17 Jul 2024 20:30:07 +0200
parents beb29ec605f9
children 67c69efcf1d8
files runtime/doc/autocmd.txt src/getchar.c src/testdir/test_autocmd.vim src/version.c
diffstat 4 files changed, 37 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt*   For Vim version 9.1.  Last change: 2024 Jul 11
+*autocmd.txt*   For Vim version 9.1.  Last change: 2024 Jul 17
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -980,10 +980,11 @@ InsertLeavePre			Just before leaving Ins
 InsertLeave			Just after leaving Insert mode.  Also when
 				using CTRL-O |i_CTRL-O|.  But not for |i_CTRL-C|.
 							*KeyInputPre*
-KeyInputPre			Just before a key is processed. The pattern is
-				matched against a string that indicates the
-				current mode, which is the same as what is
-				returned by `mode(1)`.
+KeyInputPre			Just before a key is processed after mappings
+				have been applied. The pattern is matched
+				against a string that indicates the current
+				mode, which is the same as what is returned by
+				`mode(1)`.
 				The |v:char| variable indicates the key typed
 				and can be changed during the event to process
 				a different key.  When |v:char| is not a
@@ -991,6 +992,7 @@ KeyInputPre			Just before a key is proce
 				character is used.
 				The following values of |v:event| are set:
 				   typed	The key is typed or not.
+				   typedchar	The (actual) typed key.
 				It is not allowed to change the text
 				|textlock| or the current mode.
 				{only with the +eval feature}
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -42,6 +42,11 @@ static buffheader_T recordbuff = {{NULL,
 
 static int typeahead_char = 0;		// typeahead char that's not flushed
 
+#ifdef FEAT_EVAL
+static char_u typedchars[MAXMAPLEN + 1] = { NUL };  // typed chars before map
+static int typedchars_pos = 0;
+#endif
+
 /*
  * When block_redo is TRUE the redo buffer will not be changed.
  * Used by edit() to repeat insertions.
@@ -1709,6 +1714,13 @@ updatescript(int c)
 	ml_sync_all(c == 0, TRUE);
 	count = 0;
     }
+#ifdef FEAT_EVAL
+    if (typedchars_pos < MAXMAPLEN)
+    {
+	typedchars[typedchars_pos] = c;
+	typedchars_pos++;
+    }
+#endif
 }
 
 /*
@@ -2135,6 +2147,9 @@ vgetc(void)
 
 #ifdef FEAT_EVAL
     c = do_key_input_pre(c);
+
+    // Clear the next typedchars_pos
+    typedchars_pos = 0;
 #endif
 
     // Need to process the character before we know it's safe to do something
@@ -2175,6 +2190,9 @@ do_key_input_pre(int c)
     else
 	buf[(*mb_char2bytes)(c, buf)] = NUL;
 
+    typedchars[typedchars_pos] = NUL;
+    vim_unescape_csi(typedchars);
+
     get_mode(curr_mode);
 
     // Lock the text to avoid weird things from happening.
@@ -2183,6 +2201,7 @@ do_key_input_pre(int c)
 
     v_event = get_v_event(&save_v_event);
     (void)dict_add_bool(v_event, "typed", KeyTyped);
+    (void)dict_add_string(v_event, "typedchar", typedchars);
 
     if (apply_autocmds(EVENT_KEYINPUTPRE, curr_mode, curr_mode, FALSE, curbuf)
 	&& STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0)
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -4820,6 +4820,15 @@ func Test_KeyInputPre()
   call feedkeys('j', 'nx')
 
   au! KeyInputPre
+
+  " Test for v:event.typedchar
+  nnoremap j   k
+  au KeyInputPre n
+        \   call assert_equal(v:event.typedchar, 'j')
+        \ | call assert_equal(v:char, 'k')
+  call feedkeys('j', 'tx')
+
+  au! KeyInputPre
 endfunc
 
 " vim: shiftwidth=2 sts=2 expandtab
--- 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 */
 /**/
+    597,
+/**/
     596,
 /**/
     595,