0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.2961: keys typed during a :normal command are discarded

Problem:    Keys typed during a :normal command are discarded.
Solution:   Concatenate saved typeahead and typed kesy. (closes #8340)
This commit is contained in:
Bram Moolenaar 2021-06-07 22:04:52 +02:00
parent 8cf02e5cf8
commit c41badb748
8 changed files with 23 additions and 10 deletions

View File

@ -140,7 +140,7 @@ do_debug(char_u *cmd)
if (typeahead_saved) if (typeahead_saved)
{ {
restore_typeahead(&typeaheadbuf); restore_typeahead(&typeaheadbuf, TRUE);
ignore_script = save_ignore_script; ignore_script = save_ignore_script;
} }
ex_normal_busy = save_ex_normal_busy; ex_normal_busy = save_ex_normal_busy;

View File

@ -5873,7 +5873,7 @@ f_inputrestore(typval_T *argvars UNUSED, typval_T *rettv)
{ {
--ga_userinput.ga_len; --ga_userinput.ga_len;
restore_typeahead((tasave_T *)(ga_userinput.ga_data) restore_typeahead((tasave_T *)(ga_userinput.ga_data)
+ ga_userinput.ga_len); + ga_userinput.ga_len, TRUE);
// default return is zero == OK // default return is zero == OK
} }
else if (p_verbose > 1) else if (p_verbose > 1)

View File

@ -8249,7 +8249,7 @@ save_current_state(save_state_T *sst)
restore_current_state(save_state_T *sst) restore_current_state(save_state_T *sst)
{ {
// Restore the previous typeahead. // Restore the previous typeahead.
restore_typeahead(&sst->tabuf); restore_typeahead(&sst->tabuf, FALSE);
msg_scroll = sst->save_msg_scroll; msg_scroll = sst->save_msg_scroll;
restart_edit = sst->save_restart_edit; restart_edit = sst->save_restart_edit;

View File

@ -1414,9 +1414,10 @@ save_typeahead(tasave_T *tp)
/* /*
* Restore the typeahead to what it was before calling save_typeahead(). * Restore the typeahead to what it was before calling save_typeahead().
* The allocated memory is freed, can only be called once! * The allocated memory is freed, can only be called once!
* When "overwrite" is FALSE input typed later is kept.
*/ */
void void
restore_typeahead(tasave_T *tp) restore_typeahead(tasave_T *tp, int overwrite UNUSED)
{ {
if (tp->typebuf_valid) if (tp->typebuf_valid)
{ {
@ -1432,7 +1433,7 @@ restore_typeahead(tasave_T *tp)
free_buff(&readbuf2); free_buff(&readbuf2);
readbuf2 = tp->save_readbuf2; readbuf2 = tp->save_readbuf2;
# ifdef USE_INPUT_BUF # ifdef USE_INPUT_BUF
set_input_buf(tp->save_inputbuf); set_input_buf(tp->save_inputbuf, overwrite);
# endif # endif
} }

View File

@ -32,7 +32,7 @@ int typebuf_maplen(void);
void del_typebuf(int len, int offset); void del_typebuf(int len, int offset);
int save_typebuf(void); int save_typebuf(void);
void save_typeahead(tasave_T *tp); void save_typeahead(tasave_T *tp);
void restore_typeahead(tasave_T *tp); void restore_typeahead(tasave_T *tp, int overwrite);
void openscript(char_u *name, int directly); void openscript(char_u *name, int directly);
void close_all_scripts(void); void close_all_scripts(void);
int using_script(void); int using_script(void);

View File

@ -19,7 +19,7 @@ int vim_is_input_buf_empty(void);
int vim_free_in_input_buf(void); int vim_free_in_input_buf(void);
int vim_used_in_input_buf(void); int vim_used_in_input_buf(void);
char_u *get_input_buf(void); char_u *get_input_buf(void);
void set_input_buf(char_u *p); void set_input_buf(char_u *p, int overwrite);
void add_to_input_buf(char_u *s, int len); void add_to_input_buf(char_u *s, int len);
void add_to_input_buf_csi(char_u *str, int len); void add_to_input_buf_csi(char_u *str, int len);
void trash_input_buf(void); void trash_input_buf(void);

View File

@ -810,9 +810,10 @@ get_input_buf(void)
/* /*
* Restore the input buffer with a pointer returned from get_input_buf(). * Restore the input buffer with a pointer returned from get_input_buf().
* The allocated memory is freed, this only works once! * The allocated memory is freed, this only works once!
* When "overwrite" is FALSE input typed later is kept.
*/ */
void void
set_input_buf(char_u *p) set_input_buf(char_u *p, int overwrite)
{ {
garray_T *gap = (garray_T *)p; garray_T *gap = (garray_T *)p;
@ -820,8 +821,17 @@ set_input_buf(char_u *p)
{ {
if (gap->ga_data != NULL) if (gap->ga_data != NULL)
{ {
mch_memmove(inbuf, gap->ga_data, gap->ga_len); if (overwrite || inbufcount + gap->ga_len >= INBUFLEN)
inbufcount = gap->ga_len; {
mch_memmove(inbuf, gap->ga_data, gap->ga_len);
inbufcount = gap->ga_len;
}
else
{
mch_memmove(inbuf + gap->ga_len, inbuf, inbufcount);
mch_memmove(inbuf, gap->ga_data, gap->ga_len);
inbufcount += gap->ga_len;
}
vim_free(gap->ga_data); vim_free(gap->ga_data);
} }
vim_free(gap); vim_free(gap);

View File

@ -750,6 +750,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 */
/**/
2961,
/**/ /**/
2960, 2960,
/**/ /**/