0
0
mirror of https://github.com/vim/vim.git synced 2025-10-12 06:44:06 -04:00

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>
This commit is contained in:
Shougo Matsushita
2024-07-17 20:25:22 +02:00
committed by Christian Brabandt
parent 76c19028ff
commit fcc1b5741e
4 changed files with 37 additions and 5 deletions

View File

@@ -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 VIM REFERENCE MANUAL by Bram Moolenaar
@@ -980,10 +980,11 @@ InsertLeavePre Just before leaving Insert mode. Also when
InsertLeave Just after leaving Insert mode. Also when InsertLeave Just after leaving Insert mode. Also when
using CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|. using CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|.
*KeyInputPre* *KeyInputPre*
KeyInputPre Just before a key is processed. The pattern is KeyInputPre Just before a key is processed after mappings
matched against a string that indicates the have been applied. The pattern is matched
current mode, which is the same as what is against a string that indicates the current
returned by `mode(1)`. mode, which is the same as what is returned by
`mode(1)`.
The |v:char| variable indicates the key typed The |v:char| variable indicates the key typed
and can be changed during the event to process and can be changed during the event to process
a different key. When |v:char| is not a a different key. When |v:char| is not a
@@ -991,6 +992,7 @@ KeyInputPre Just before a key is processed. The pattern is
character is used. character is used.
The following values of |v:event| are set: The following values of |v:event| are set:
typed The key is typed or not. typed The key is typed or not.
typedchar The (actual) typed key.
It is not allowed to change the text It is not allowed to change the text
|textlock| or the current mode. |textlock| or the current mode.
{only with the +eval feature} {only with the +eval feature}

View File

@@ -42,6 +42,11 @@ static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0};
static int typeahead_char = 0; // typeahead char that's not flushed 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. * When block_redo is TRUE the redo buffer will not be changed.
* Used by edit() to repeat insertions. * Used by edit() to repeat insertions.
@@ -1709,6 +1714,13 @@ updatescript(int c)
ml_sync_all(c == 0, TRUE); ml_sync_all(c == 0, TRUE);
count = 0; 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 #ifdef FEAT_EVAL
c = do_key_input_pre(c); c = do_key_input_pre(c);
// Clear the next typedchars_pos
typedchars_pos = 0;
#endif #endif
// Need to process the character before we know it's safe to do something // 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 else
buf[(*mb_char2bytes)(c, buf)] = NUL; buf[(*mb_char2bytes)(c, buf)] = NUL;
typedchars[typedchars_pos] = NUL;
vim_unescape_csi(typedchars);
get_mode(curr_mode); get_mode(curr_mode);
// Lock the text to avoid weird things from happening. // 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); v_event = get_v_event(&save_v_event);
(void)dict_add_bool(v_event, "typed", KeyTyped); (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) if (apply_autocmds(EVENT_KEYINPUTPRE, curr_mode, curr_mode, FALSE, curbuf)
&& STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0) && STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0)

View File

@@ -4820,6 +4820,15 @@ func Test_KeyInputPre()
call feedkeys('j', 'nx') call feedkeys('j', 'nx')
au! KeyInputPre 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 endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
597,
/**/ /**/
596, 596,
/**/ /**/