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:
committed by
Christian Brabandt
parent
76c19028ff
commit
fcc1b5741e
@@ -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}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user