diff options
-rw-r--r-- | runtime/doc/intro.txt | 3 | ||||
-rw-r--r-- | src/nvim/keymap.c | 2 | ||||
-rw-r--r-- | test/functional/ui/input_spec.lua | 5 |
3 files changed, 9 insertions, 1 deletions
diff --git a/runtime/doc/intro.txt b/runtime/doc/intro.txt index 1fb06e169c..c240f08a75 100644 --- a/runtime/doc/intro.txt +++ b/runtime/doc/intro.txt @@ -404,6 +404,9 @@ Mapping <kHome> will not work then. Note: If numlock is on, the |TUI| receives plain ASCII values, so mappings to <k0> - <k9> and <kPoint> will not work. +Note: Nvim supports mapping multibyte chars with modifiers such as `<M-ä>`. +Which combinations actually are usable depends on the terminal emulator or GUI. + *<>* Examples are often given in the <> notation. Sometimes this is just to make clear what you need to type, but often it can be typed literally, e.g., with diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index 9145813525..27052da9d8 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -604,7 +604,7 @@ int find_special_key(const char_u **srcp, const size_t src_len, int *const modp, // Anything accepted, like <C-?>. // <C-"> or <M-"> are not special in strings as " is // the string delimiter. With a backslash it works: <M-\"> - if (end - bp > l && !(in_string && bp[1] == '"') && bp[2] == '>') { + if (end - bp > l && !(in_string && bp[1] == '"') && bp[l+1] == '>') { bp += l; } else if (end - bp > 2 && in_string && bp[1] == '\\' && bp[2] == '"' && bp[3] == '>') { diff --git a/test/functional/ui/input_spec.lua b/test/functional/ui/input_spec.lua index 121cbe47d6..0009f2c31b 100644 --- a/test/functional/ui/input_spec.lua +++ b/test/functional/ui/input_spec.lua @@ -103,6 +103,11 @@ describe('mappings', function() check_mapping('<kequal>','<kequal>') check_mapping('<KPEquals>','<kequal>') end) + + it('support meta + multibyte char mapping', function() + add_mapping('<m-ä>', '<m-ä>') + check_mapping('<m-ä>', '<m-ä>') + end) end) describe('feeding large chunks of input with <Paste>', function() |