diff src/term.c @ 22764:d03221aa54f3 v8.2.1930

patch 8.2.1930: wrong input if removing shift results in special key code Commit: https://github.com/vim/vim/commit/749bc9521d9c1b3b3250faef25a3710206cf277d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 31 16:33:47 2020 +0100 patch 8.2.1930: wrong input if removing shift results in special key code Problem: Wrong input if removing shift results in special key code. Solution: Handle special key codes. (closes https://github.com/vim/vim/issues/7189)
author Bram Moolenaar <Bram@vim.org>
date Sat, 31 Oct 2020 16:45:03 +0100
parents f7f2d73ff85e
children 9c8af140b2da
line wrap: on
line diff
--- a/src/term.c
+++ b/src/term.c
@@ -4462,7 +4462,8 @@ modifiers2keycode(int modifiers, int *ke
     if (modifiers != 0)
     {
 	// Some keys have the modifier included.  Need to handle that here to
-	// make mappings work.
+	// make mappings work.  This may result in a special key, such as
+	// K_S_TAB.
 	*key = simplify_key(*key, &modifiers);
 	if (modifiers != 0)
 	{
@@ -4793,7 +4794,13 @@ handle_key_with_modifier(
     // insert modifiers with KS_MODIFIER
     new_slen = modifiers2keycode(modifiers, &key, string);
 
-    if (has_mbyte)
+    if (IS_SPECIAL(key))
+    {
+	string[new_slen++] = K_SPECIAL;
+	string[new_slen++] = KEY2TERMCAP0(key);
+	string[new_slen++] = KEY2TERMCAP1(key);
+    }
+    else if (has_mbyte)
 	new_slen += (*mb_char2bytes)(key, string + new_slen);
     else
 	string[new_slen++] = key;