# HG changeset patch # User Bram Moolenaar # Date 1591538406 -7200 # Node ID e3078150144de4ff10eeba1feca46e89141eb9af # Parent 34095410f55f2824e38fe7fd7fa06009872c1661 patch 8.2.0919: merging modifier for modifyOtherKeys is done twice Commit: https://github.com/vim/vim/commit/673fc3e23f09095d17f0095c4323958041b2d0d2 Author: Bram Moolenaar Date: Sun Jun 7 15:46:11 2020 +0200 patch 8.2.0919: merging modifier for modifyOtherKeys is done twice Problem: Merging modifier for modifyOtherKeys is done twice. Solution: Remove the merging done in vgetc(). diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2225,7 +2225,9 @@ getcmdline_int( ignore_drag_release = TRUE; putcmdline('^', TRUE); + no_reduce_keys = TRUE; // don't merge modifyOtherKeys c = get_literal(); // get next (two) character(s) + no_reduce_keys = FALSE; do_abbr = FALSE; // don't do abbreviation now extra_char = NUL; // may need to remove ^ when composing char was typed diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -1858,15 +1858,10 @@ vgetc(void) c = (*mb_ptr2char)(buf); } - if (!no_reduce_keys) + if (vgetc_char == 0) { - // 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, &mod_mask); } break; @@ -2274,17 +2269,39 @@ check_simplify_modifier(int max_offset) tp = typebuf.tb_buf + typebuf.tb_off + offset; if (tp[0] == K_SPECIAL && tp[1] == KS_MODIFIER) { + // A modifier was not used for a mapping, apply it to ASCII keys. + // Shift would already have been applied. int modifier = tp[2]; - int new_c = merge_modifyOtherKeys(tp[3], &modifier); - - if (new_c != tp[3] && modifier == 0) + int c = tp[3]; + int new_c = merge_modifyOtherKeys(c, &modifier); + + if (new_c != c) { char_u new_string[MB_MAXBYTES]; - int len = mb_char2bytes(new_c, new_string); - - if (put_string_in_typebuf(offset, 4, new_string, len, + int len; + + if (offset == 0) + { + // At the start: remember the character and mod_mask before + // merging, in some cases, e.g. at the hit-return prompt, + // they are put back in the typeahead buffer. + vgetc_char = c; + vgetc_mod_mask = tp[2]; + } + len = mb_char2bytes(new_c, new_string); + if (modifier == 0) + { + if (put_string_in_typebuf(offset, 4, new_string, len, NULL, 0, 0) == FAIL) return -1; + } + else + { + tp[2] = modifier; + if (put_string_in_typebuf(offset + 3, 1, new_string, len, + NULL, 0, 0) == FAIL) + return -1; + } return len; } } @@ -2559,7 +2576,7 @@ handle_mapping( // If no termcode matched, try to include the modifier into the // key. This for when modifyOtherKeys is working. - if (keylen == 0) + if (keylen == 0 && !no_reduce_keys) keylen = check_simplify_modifier(max_mlen + 1); // When getting a partial match, but the last characters were not diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 919, +/**/ 918, /**/ 917,