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

patch 9.1.0563: Cannot process any Key event

Problem:  Cannot process any Key event
Solution: Add the KeyInputPre autocmd
          (Shougo Matsushita)

closes: #15182

Co-authored-by: zeertzjq <zeertzjq@outlook.com>
Co-authored-by: K.Takata <kentkt@csc.jp>
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-11 22:05:12 +02:00
committed by Christian Brabandt
parent e7b98ab96e
commit 8367884909
10 changed files with 182 additions and 2 deletions

View File

@@ -96,6 +96,9 @@ static void closescript(void);
static void updatescript(int c);
static int vgetorpeek(int);
static int inchar(char_u *buf, int maxlen, long wait_time);
#ifdef FEAT_EVAL
static int do_key_input_pre(int c);
#endif
/*
* Free and clear a buffer.
@@ -2130,6 +2133,10 @@ vgetc(void)
}
#endif
#ifdef FEAT_EVAL
c = do_key_input_pre(c);
#endif
// Need to process the character before we know it's safe to do something
// else.
if (c != K_IGNORE)
@@ -2138,6 +2145,74 @@ vgetc(void)
return c;
}
#ifdef FEAT_EVAL
/*
* Handle the InsertCharPre autocommand.
* "c" is the character that was typed.
* Return new input character.
*/
static int
do_key_input_pre(int c)
{
int res = c;
char_u buf[MB_MAXBYTES + 1];
char_u curr_mode[MODE_MAX_LENGTH];
int save_State = State;
save_v_event_T save_v_event;
dict_T *v_event;
// Return quickly when there is nothing to do.
if (!has_keyinputpre())
return res;
if (IS_SPECIAL(c))
{
buf[0] = K_SPECIAL;
buf[1] = KEY2TERMCAP0(c);
buf[2] = KEY2TERMCAP1(c);
buf[3] = NUL;
}
else
buf[(*mb_char2bytes)(c, buf)] = NUL;
get_mode(curr_mode);
// Lock the text to avoid weird things from happening.
++textlock;
set_vim_var_string(VV_CHAR, buf, -1); // set v:char
v_event = get_v_event(&save_v_event);
(void)dict_add_bool(v_event, "typed", KeyTyped);
if (apply_autocmds(EVENT_KEYINPUTPRE, curr_mode, curr_mode, FALSE, curbuf)
&& STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0)
{
// Get the value of v:char. It may be empty or more than one
// character. Only use it when changed, otherwise continue with the
// original character.
char_u *v_char;
v_char = get_vim_var_str(VV_CHAR);
// Convert special bytes when it is special string.
if (STRLEN(v_char) >= 3 && v_char[0] == K_SPECIAL)
res = TERMCAP2KEY(v_char[1], v_char[2]);
else if (STRLEN(v_char) > 0)
res = PTR2CHAR(v_char);
}
restore_v_event(v_event, &save_v_event);
set_vim_var_string(VV_CHAR, NULL, -1); // clear v:char
--textlock;
// Restore the State, it may have been changed.
State = save_State;
return res;
}
#endif
/*
* Like vgetc(), but never return a NUL when called recursively, get a key
* directly from the user (ignoring typeahead).