aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/option.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/option.c')
-rw-r--r--src/nvim/option.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c
index aa6f330dfc..f54da54a4b 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -1525,7 +1525,9 @@ static int find_key_len(const char *arg_arg, size_t len, bool has_lt)
// Don't use get_special_key_code() for t_xx, we don't want it to call
// add_termcap_entry().
if (len >= 4 && arg[0] == 't' && arg[1] == '_') {
- key = TERMCAP2KEY((uint8_t)arg[2], (uint8_t)arg[3]);
+ if (!has_lt || arg[4] == '>') {
+ key = TERMCAP2KEY((uint8_t)arg[2], (uint8_t)arg[3]);
+ }
} else if (has_lt) {
arg--; // put arg at the '<'
int modifiers = 0;
@@ -1539,14 +1541,18 @@ static int find_key_len(const char *arg_arg, size_t len, bool has_lt)
}
/// Convert a key name or string into a key value.
-/// Used for 'wildchar' and 'cedit' options.
+/// Used for 'cedit', 'wildchar' and 'wildcharm' options.
int string_to_key(char *arg)
{
- if (*arg == '<') {
+ if (*arg == '<' && arg[1]) {
return find_key_len(arg + 1, strlen(arg), true);
}
- if (*arg == '^') {
- return CTRL_CHR((uint8_t)arg[1]);
+ if (*arg == '^' && arg[1]) {
+ int key = CTRL_CHR((uint8_t)arg[1]);
+ if (key == 0) { // ^@ is <Nul>
+ key = K_ZERO;
+ }
+ return key;
}
return (uint8_t)(*arg);
}