0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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;
}

View File

@@ -120,7 +120,12 @@ EXTERN int screen_Columns INIT(= 0); // actual size of ScreenLines[]
* When vgetc() is called, it sets mod_mask to the set of modifiers that are
* held down based on the MOD_MASK_* symbols that are read first.
*/
EXTERN int mod_mask INIT(= 0x0); // current key modifiers
EXTERN int mod_mask INIT(= 0); // current key modifiers
// The value of "mod_mask" and the unomdified character before calling
// merge_modifyOtherKeys().
EXTERN int vgetc_mod_mask INIT(= 0);
EXTERN int vgetc_char INIT(= 0);
/*
* Cmdline_row is the row where the command line starts, just below the

View File

@@ -1258,7 +1258,7 @@ wait_return(int redraw)
{
// Put the character back in the typeahead buffer. Don't use the
// stuff buffer, because lmaps wouldn't work.
ins_char_typebuf(c);
ins_char_typebuf(vgetc_char, vgetc_mod_mask);
do_redraw = TRUE; // need a redraw even though there is
// typeahead
}
@@ -3712,7 +3712,7 @@ do_dialog(
if (c == ':' && ex_cmd)
{
retval = dfltbutton;
ins_char_typebuf(':');
ins_char_typebuf(':', 0);
break;
}

View File

@@ -595,7 +595,7 @@ normal_cmd(
// restart automatically.
// Insert the typed character in the typeahead buffer, so that it can
// be mapped in Insert mode. Required for ":lmap" to work.
ins_char_typebuf(c);
ins_char_typebuf(vgetc_char, vgetc_mod_mask);
if (restart_edit != 0)
c = 'd';
else

View File

@@ -25,7 +25,7 @@ int start_redo_ins(void);
void stop_redo_ins(void);
int noremap_keys(void);
int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, int silent);
void ins_char_typebuf(int c);
void ins_char_typebuf(int c, int modifier);
int typebuf_changed(int tb_change_cnt);
int typebuf_typed(void);
int typebuf_maplen(void);

View File

@@ -3467,7 +3467,7 @@ term_channel_closed(channel_T *ch)
redraw_statuslines();
// Need to break out of vgetc().
ins_char_typebuf(K_IGNORE);
ins_char_typebuf(K_IGNORE, 0);
typebuf_was_filled = TRUE;
term = curbuf->b_term;

View File

@@ -2,6 +2,7 @@
source shared.vim
source term_util.vim
source view_util.vim
func Test_messages()
let oldmore = &more
@@ -305,4 +306,12 @@ func Test_null()
endif
endfunc
func Test_mapping_at_hit_return_prompt()
nnoremap <C-B> :echo "hit ctrl-b"<CR>
call feedkeys(":ls\<CR>", "xt")
call feedkeys("\<C-B>", "xt")
call assert_match('hit ctrl-b', Screenline(&lines - 1))
nunmap <C-B>
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

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