aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/getchar.c88
1 files changed, 44 insertions, 44 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 20c53703da..d6534a08ff 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1634,6 +1634,50 @@ int vgetc(void)
c = TO_SPECIAL(c2, c);
}
+ // For a multi-byte character get all the bytes and return the
+ // converted character.
+ // Note: This will loop until enough bytes are received!
+ int n;
+ if ((n = MB_BYTE2LEN_CHECK(c)) > 1) {
+ no_mapping++;
+ buf[0] = (uint8_t)c;
+ for (int i = 1; i < n; i++) {
+ buf[i] = (uint8_t)vgetorpeek(true);
+ if (buf[i] == K_SPECIAL) {
+ // Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence,
+ // which represents a K_SPECIAL (0x80).
+ vgetorpeek(true); // skip KS_SPECIAL
+ vgetorpeek(true); // skip KE_FILLER
+ }
+ }
+ no_mapping--;
+ c = utf_ptr2char((char *)buf);
+ }
+
+ // If mappings are enabled (i.e., not i_CTRL-V) and the user directly typed
+ // something with MOD_MASK_ALT (<M-/<A- modifier) that was not mapped, interpret
+ // <M-x> as <Esc>x rather than as an unbound <M-x> keypress. #8213
+ // In Terminal mode, however, this is not desirable. #16202 #16220
+ // Also do not do this for mouse keys, as terminals encode mouse events as
+ // CSI sequences, and MOD_MASK_ALT has a meaning even for unmapped mouse keys.
+ if (!no_mapping && KeyTyped && mod_mask == MOD_MASK_ALT
+ && !(State & MODE_TERMINAL) && !is_mouse_key(c)) {
+ mod_mask = 0;
+ int len = ins_char_typebuf(c, 0, false);
+ ins_char_typebuf(ESC, 0, false);
+ int old_len = len + 3; // K_SPECIAL KS_MODIFIER MOD_MASK_ALT takes 3 more bytes
+ ungetchars(old_len);
+ if (on_key_buf.size >= (size_t)old_len) {
+ on_key_buf.size -= (size_t)old_len;
+ }
+ continue;
+ }
+
+ if (vgetc_char == 0) {
+ vgetc_mod_mask = mod_mask;
+ vgetc_char = c;
+ }
+
// a keypad or special function key was not mapped, use it like
// its ASCII equivalent
switch (c) {
@@ -1713,50 +1757,6 @@ int vgetc(void)
c = K_RIGHT; break;
}
- // For a multi-byte character get all the bytes and return the
- // converted character.
- // Note: This will loop until enough bytes are received!
- int n;
- if ((n = MB_BYTE2LEN_CHECK(c)) > 1) {
- no_mapping++;
- buf[0] = (uint8_t)c;
- for (int i = 1; i < n; i++) {
- buf[i] = (uint8_t)vgetorpeek(true);
- if (buf[i] == K_SPECIAL) {
- // Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence,
- // which represents a K_SPECIAL (0x80).
- vgetorpeek(true); // skip KS_SPECIAL
- vgetorpeek(true); // skip KE_FILLER
- }
- }
- no_mapping--;
- c = utf_ptr2char((char *)buf);
- }
-
- if (vgetc_char == 0) {
- vgetc_mod_mask = mod_mask;
- vgetc_char = c;
- }
-
- // If mappings are enabled (i.e., not i_CTRL-V) and the user directly typed something with
- // MOD_MASK_ALT (<M-/<A- modifier) that was not mapped, interpret <M-x> as <Esc>x rather
- // than as an unbound <M-x> keypress. #8213
- // In Terminal mode, however, this is not desirable. #16202 #16220
- // Also do not do this for mouse keys, as terminals encode mouse events as CSI sequences, and
- // MOD_MASK_ALT has a meaning even for unmapped mouse keys.
- if (!no_mapping && KeyTyped && mod_mask == MOD_MASK_ALT && !(State & MODE_TERMINAL)
- && !is_mouse_key(c)) {
- mod_mask = 0;
- int len = ins_char_typebuf(c, 0, false);
- ins_char_typebuf(ESC, 0, false);
- int old_len = len + 3; // K_SPECIAL KS_MODIFIER MOD_MASK_ALT takes 3 more bytes
- ungetchars(old_len);
- if (on_key_buf.size >= (size_t)old_len) {
- on_key_buf.size -= (size_t)old_len;
- }
- continue;
- }
-
break;
}