# HG changeset patch # User Bram Moolenaar # Date 1675427405 -3600 # Node ID b374dfaa8645b637bf4f2ebd811cebb5cf03f193 # Parent 8d48f340b010d55ac99ec644cd71ad92305ec7b0 patch 9.0.1276: some mappings with Meta and Shift do not work Commit: https://github.com/vim/vim/commit/4be18e77ff2d9a85d01e9d62335542755b26d5d5 Author: Bram Moolenaar Date: Fri Feb 3 12:28:07 2023 +0000 patch 9.0.1276: some mappings with Meta and Shift do not work Problem: Some mappings with Meta and Shift do not work. Solution: Apply the Shift modifier to the key. (issue https://github.com/vim/vim/issues/11913) diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -20,9 +20,10 @@ 1. Key mapping |key-mapping| 1.8 Examples |map-examples| 1.9 Using mappings |map-typing| 1.10 Mapping alt-keys |:map-alt-keys| - 1.11 Mapping in modifyOtherKeys mode |modifyOtherKeys| - 1.12 Mapping with Kitty keyboard protocol |kitty-keyboard-protocol| - 1.13 Mapping an operator |:map-operator| + 1.11 Mapping meta-keys |:map-meta-keys| + 1.12 Mapping in modifyOtherKeys mode |modifyOtherKeys| + 1.13 Mapping with Kitty keyboard protocol |kitty-keyboard-protocol| + 1.14 Mapping an operator |:map-operator| 2. Abbreviations |abbreviations| 3. Local mappings and functions |script-local| 4. User-defined commands |user-commands| @@ -794,8 +795,8 @@ otherwise you would not be able to use t suggestions: - Function keys , , etc.. Also the shifted function keys , , etc. Note that is already used for the help command. -- Meta-keys (with the ALT key pressed). Depending on your keyboard accented - characters may be used as well. |:map-alt-keys| +- Any key with the Alt or Meta key pressed. Depending on your keyboard + accented characters may be used as well. |:map-alt-keys| - Use the '_' or ',' character and then any other character. The "_" and "," commands do exist in Vim (see |_| and |,|), but you probably never use them. - Use a key that is a synonym for another command. For example: CTRL-P and @@ -928,6 +929,8 @@ out whether ALT was pressed or not. If the terminal supports the modifyOtherKeys mode and it has been enabled, then Vim can recognize more key combinations, see |modifyOtherKeys| below. +The Kitty keyboard protocol works in a similar way, see +|kitty-keyboard-protocol|. By default Vim assumes that pressing the ALT key sets the 8th bit of a typed character. Most decent terminals can work that way, such as xterm, aterm and @@ -966,7 +969,21 @@ on the terminal; that's a good last reso using other applications but not when inside Vim. -1.11 MAPPING IN modifyOtherKeys mode *modifyOtherKeys* +1.11 MAPPING META-KEYS *:map-meta-keys* + +Mapping keys with the Meta modifier works very similar to using the Alt key. +What key on your keyboard produces the Meta modifier depends on your keyboard +and configuration. + +Note that mapping actually is for using the Alt key. That can be +confusing! It cannot be changed, it would not be backwards compatible. + +For the Meta modifier the "T" character is used. For example, to map Meta-b +in Insert mode: > + :imap terrible + + +1.12 MAPPING IN modifyOtherKeys mode *modifyOtherKeys* Xterm and a few other terminals can be put in a mode where keys with modifiers are sent with a special escape code. Vim recognizes these codes and can then @@ -1028,7 +1045,7 @@ When the 'esckeys' option is off, then m Insert mode to avoid every key with a modifier causing Insert mode to end. -1.12 MAPPING WITH KITTY KEYBOARD PROTOCOL *kitty-keyboard-protocol* +1.13 MAPPING WITH KITTY KEYBOARD PROTOCOL *kitty-keyboard-protocol* If the value of 'term' contains "kitty" then Vim will send out an escape sequence to enable the Kitty keyboard protocol. This can be changed with the @@ -1055,7 +1072,7 @@ translated). The meaning of {value}: previous state is unknown -1.13 MAPPING AN OPERATOR *:map-operator* +1.14 MAPPING AN OPERATOR *:map-operator* An operator is used before a {motion} command. To define your own operator you must create a mapping that first sets the 'operatorfunc' option and then diff --git a/src/term.c b/src/term.c --- a/src/term.c +++ b/src/term.c @@ -5343,6 +5343,12 @@ handle_key_with_modifier( int key = trail == 'u' ? arg[0] : arg[2]; int modifiers = decode_modifiers(arg[1]); + + // Some terminals do not apply the Shift modifier to the key. To make + // mappings consistent we do it here. TODO: support more keys. + if ((modifiers & MOD_MASK_SHIFT) && key >= 'a' && key <= 'z') + key += 'A' - 'a'; + return put_key_modifiers_in_typebuf(key, modifiers, csi_len, offset, buf, bufsize, buflen); } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1276, +/**/ 1275, /**/ 1274,