aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/getchar.c
diff options
context:
space:
mode:
authorerw7 <erw7.github@gmail.com>2021-10-03 06:27:37 +0900
committerGitHub <noreply@github.com>2021-10-02 14:27:37 -0700
commitc4857b695fe2ffa9fc74da01b01809480510ac39 (patch)
treed441207e638293912287dcebf113723675197b1e /src/nvim/getchar.c
parent79fb9ed080bb32a442d1c788da6f0b71d72bcedd (diff)
downloadrneovim-c4857b695fe2ffa9fc74da01b01809480510ac39.tar.gz
rneovim-c4857b695fe2ffa9fc74da01b01809480510ac39.tar.bz2
rneovim-c4857b695fe2ffa9fc74da01b01809480510ac39.zip
fix(input): resolve isolated (non-ALT/META) mappings #13109
Problem: Since 2f06413dfb36 #13042, "ESC+c" sequence is treated as "ESC c" instead of "M-c" (ALT/META+c) when not mapped, aka "fallthrough" behavior. But "isolated" (non-ALT/META) mappings to ESC and c were not resolved. This behavior is especially confusing for the TUI. Solution: Resolve isolated ESC, c mappings when there is no M-c mapping. Change ins_char_typebuf() to escape CSI, K_SPECIAL. fixes #13086 fixes #15869
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r--src/nvim/getchar.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index beb4ff4da6..16ad890360 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1000,6 +1000,18 @@ void ins_char_typebuf(int c)
buf[3] = NUL;
} else {
buf[utf_char2bytes(c, buf)] = NUL;
+ char_u *p = buf;
+ while (*p) {
+ if ((uint8_t)(*p) == CSI || (uint8_t)(*p) == K_SPECIAL) {
+ bool is_csi = (uint8_t)(*p) == CSI;
+ memmove(p + 3, p + 1, STRLEN(p + 1) + 1);
+ *p++ = K_SPECIAL;
+ *p++ = is_csi ? KS_EXTRA : KS_SPECIAL;
+ *p++ = is_csi ? KE_CSI : KE_FILLER;
+ } else {
+ p++;
+ }
+ }
}
(void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
}
@@ -1573,9 +1585,9 @@ int vgetc(void)
if (!no_mapping && KeyTyped
&& (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META)) {
mod_mask = 0;
- stuffcharReadbuff(c);
- u_sync(false);
- c = ESC;
+ ins_char_typebuf(c);
+ ins_char_typebuf(ESC);
+ continue;
}
break;