changeset 20733:e3078150144d v8.2.0919

patch 8.2.0919: merging modifier for modifyOtherKeys is done twice Commit: https://github.com/vim/vim/commit/673fc3e23f09095d17f0095c4323958041b2d0d2 Author: Bram Moolenaar <Bram@vim.org> 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().
author Bram Moolenaar <Bram@vim.org>
date Sun, 07 Jun 2020 16:00:06 +0200
parents 34095410f55f
children 88e438717510
files src/ex_getln.c src/getchar.c src/version.c
diffstat 3 files changed, 34 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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,