diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-04-27 13:02:55 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-04-29 15:51:03 +0800 |
commit | 212349c100e9ada0c976bdaf1daf1aebec65edac (patch) | |
tree | dad7eb0010b211baeacc1ede2c046ff5671d1db1 /src/nvim/getchar.c | |
parent | 44269c73a32f13d39ead1fdc257a97fc18ae805c (diff) | |
download | rneovim-212349c100e9ada0c976bdaf1daf1aebec65edac.tar.gz rneovim-212349c100e9ada0c976bdaf1daf1aebec65edac.tar.bz2 rneovim-212349c100e9ada0c976bdaf1daf1aebec65edac.zip |
feat(edit): insert an unsimplified key using CTRL-SHIFT-V
This marks the following Vim patches as ported:
vim-patch:8.1.2333: with modifyOtherKeys CTRL-^ doesn't work
Problem: With modifyOtherKeys CTRL-^ doesn't work.
Solution: Handle the exception.
https://github.com/vim/vim/commit/828ffd596394f714270a01a55fc3f949a8bd9b35
vim-patch:8.1.2350: other text for CTRL-V in Insert mode with modifyOtherKeys
Problem: Other text for CTRL-V in Insert mode with modifyOtherKeys.
Solution: Convert the Escape sequence back to key as if modifyOtherKeys is
not set, and use CTRL-SHIFT-V to get the Escape sequence itself.
(closes vim/vim#5254)
https://github.com/vim/vim/commit/fc4ea2a72d36de1196a3ce17352e72f8fe90f4bb
vim-patch:8.2.2084: CTRL-V U doesn't work to enter a Unicode character
Problem: CTRL-V U doesn't work to enter a Unicode character when
modifyOtherKeys is effective. (Ken Takata)
Solution: Add a flag to get_literal() for the shift key. (closes vim/vim#7413)
https://github.com/vim/vim/commit/0684e36a7ee0743f2889698fb8e0e14f7acae423
Omit getcmdkeycmd() change as it depends on Vim patch 8.2.2062, which
may introduce a potential breakage.
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r-- | src/nvim/getchar.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index b25c59636f..f92aa14c78 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1442,6 +1442,27 @@ static void updatescript(int c) } } +/// Merge "mod_mask" into "c_arg" +int merge_modifiers(int c_arg) +{ + int c = c_arg; + + if (mod_mask & MOD_MASK_CTRL) { + if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_')) { + c &= 0x1f; + mod_mask &= ~MOD_MASK_CTRL; + if (c == 0) { + c = K_ZERO; + } + } else if (c == '6') { + // CTRL-6 is equivalent to CTRL-^ + c = 0x1e; + mod_mask &= ~MOD_MASK_CTRL; + } + } + return c; +} + /// Get the next input character. /// Can return a special key or a multi-byte character. /// Can return NUL when called recursively, use safe_vgetc() if that's not @@ -1603,19 +1624,7 @@ int vgetc(void) // A modifier was not used for a mapping, apply it to ASCII // keys. Shift would already have been applied. - if (mod_mask & MOD_MASK_CTRL) { - if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_')) { - c &= 0x1f; - mod_mask &= ~MOD_MASK_CTRL; - if (c == 0) { - c = K_ZERO; - } - } else if (c == '6') { - // CTRL-6 is equivalent to CTRL-^ - c = 0x1e; - mod_mask &= ~MOD_MASK_CTRL; - } - } + c = merge_modifiers(c); // If mappings are enabled (i.e., not Ctrl-v) and the user directly typed // something with a meta- or alt- modifier that was not mapped, interpret |