diff options
author | erw7 <erw7.github@gmail.com> | 2021-10-03 06:27:37 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-02 14:27:37 -0700 |
commit | c4857b695fe2ffa9fc74da01b01809480510ac39 (patch) | |
tree | d441207e638293912287dcebf113723675197b1e /src/nvim/getchar.c | |
parent | 79fb9ed080bb32a442d1c788da6f0b71d72bcedd (diff) | |
download | rneovim-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.c | 18 |
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; |