1
0
forked from aniani/vim

patch 8.2.0839: dropping modifier when putting a character back in typeahead

Problem:    Dropping modifier when putting a character back in typeahead.
Solution:   Add modifier to ins_char_typebuf(). (closes #6158)
This commit is contained in:
Bram Moolenaar
2020-05-29 22:41:41 +02:00
parent 09307e3bc1
commit b42c0d5427
8 changed files with 50 additions and 14 deletions

View File

@@ -1101,18 +1101,29 @@ ins_typebuf(
* the char.
*/
void
ins_char_typebuf(int c)
ins_char_typebuf(int c, int modifier)
{
char_u buf[MB_MAXBYTES + 1];
if (IS_SPECIAL(c))
char_u buf[MB_MAXBYTES + 4];
int idx = 0;
if (modifier != 0)
{
buf[0] = K_SPECIAL;
buf[1] = K_SECOND(c);
buf[2] = K_THIRD(c);
buf[1] = KS_MODIFIER;
buf[2] = modifier;
buf[3] = NUL;
idx = 3;
}
if (IS_SPECIAL(c))
{
buf[idx] = K_SPECIAL;
buf[idx + 1] = K_SECOND(c);
buf[idx + 2] = K_THIRD(c);
buf[idx + 3] = NUL;
idx += 3;
}
else
buf[(*mb_char2bytes)(c, buf)] = NUL;
buf[(*mb_char2bytes)(c, buf + idx) + idx] = NUL;
(void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
}
@@ -1640,8 +1651,11 @@ vgetc(void)
}
else
{
mod_mask = 0x0;
mod_mask = 0;
vgetc_mod_mask = 0;
vgetc_char = 0;
last_recorded_len = 0;
for (;;) // this is done twice if there are modifiers
{
int did_inc = FALSE;
@@ -1835,9 +1849,15 @@ vgetc(void)
}
if (!no_reduce_keys)
{
// A modifier was not used for a mapping, apply it to ASCII
// keys. Shift would already have been applied.
// Remember the character and mod_mask from before, in some
// cases they are put back in the typeahead buffer.
vgetc_mod_mask = mod_mask;
vgetc_char = c;
c = merge_modifyOtherKeys(c);
}
break;
}
@@ -2192,7 +2212,7 @@ parse_queued_messages(void)
// If the current window or buffer changed we need to bail out of the
// waiting loop. E.g. when a job exit callback closes the terminal window.
if (curwin->w_id != old_curwin_id || curbuf->b_fnum != old_curbuf_fnum)
ins_char_typebuf(K_IGNORE);
ins_char_typebuf(K_IGNORE, 0);
--entered;
}