diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-01-30 07:56:54 +0800 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2022-03-24 11:02:39 +0100 |
commit | d7488bf38677b5d6b1df3a88e45b3d2f21527eb4 (patch) | |
tree | 5b436b807d7aaa6f9e2eb4ab5d5c9cde58e908a5 | |
parent | a72f338d76c871869712518df862c85d1df25f54 (diff) | |
download | rneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.tar.gz rneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.tar.bz2 rneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.zip |
feat(input)!: delay some conversions to vgetc()
-rw-r--r-- | src/nvim/getchar.c | 8 | ||||
-rw-r--r-- | src/nvim/keymap.c | 16 | ||||
-rw-r--r-- | src/nvim/option_defs.h | 1 | ||||
-rw-r--r-- | src/nvim/options.lua | 7 | ||||
-rw-r--r-- | src/nvim/testdir/setup.vim | 1 | ||||
-rw-r--r-- | test/functional/legacy/eval_spec.lua | 5 |
6 files changed, 31 insertions, 7 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 3ec5d24753..c10172cc52 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1583,6 +1583,14 @@ int vgetc(void) c = utf_ptr2char(buf); } + if ((mod_mask & MOD_MASK_CTRL) && (c >= '?' && c <= '_')) { + c = Ctrl_chr(c); + mod_mask &= ~MOD_MASK_CTRL; + if (c == 0) { // <C-@> is <Nul> + c = K_ZERO; + } + } + // 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 // <M-x> as <Esc>x rather than as an unbound meta keypress. #8213 diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index 32f2158d7b..f0536cbf15 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -13,6 +13,7 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/mouse.h" +#include "nvim/option_defs.h" #include "nvim/strings.h" #include "nvim/vim.h" @@ -744,12 +745,15 @@ static int extract_modifiers(int key, int *modp) modifiers &= ~MOD_MASK_SHIFT; } } - if ((modifiers & MOD_MASK_CTRL) - && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) { - key = Ctrl_chr(key); - modifiers &= ~MOD_MASK_CTRL; - if (key == 0) { // <C-@> is <Nul> - key = K_ZERO; + if ((modifiers & MOD_MASK_CTRL) && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) { + key = TOUPPER_ASC(key); + int new_key = Ctrl_chr(key); + if (!p_clbg || (new_key != TAB && new_key != CAR && new_key != ESC)) { + key = new_key; + modifiers &= ~MOD_MASK_CTRL; + if (key == 0) { // <C-@> is <Nul> + key = K_ZERO; + } } } diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index d88cd6b9b9..b6946c4c4f 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -401,6 +401,7 @@ EXTERN int p_cst; // 'cscopetag' EXTERN long p_csto; // 'cscopetagorder' EXTERN long p_cspc; // 'cscopepathcomp' EXTERN int p_csverbose; // 'cscopeverbose' +EXTERN int p_clbg; // 'ctrldisambig' EXTERN char_u *p_debug; // 'debug' EXTERN char_u *p_def; // 'define' EXTERN char_u *p_inc; diff --git a/src/nvim/options.lua b/src/nvim/options.lua index e665ffd346..d12d1d7c2c 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -542,6 +542,13 @@ return { defaults={if_true=1} }, { + full_name='ctrldisambig', abbreviation='clbg', + short_desc=N_(""), + type='bool', scope={'global'}, + varname='p_clbg', + defaults={if_true=true} + }, + { full_name='cursorbind', abbreviation='crb', short_desc=N_("move cursor in window as it moves in other windows"), type='bool', scope={'window'}, diff --git a/src/nvim/testdir/setup.vim b/src/nvim/testdir/setup.vim index 15e3b31498..589ceb0297 100644 --- a/src/nvim/testdir/setup.vim +++ b/src/nvim/testdir/setup.vim @@ -14,6 +14,7 @@ set fsync set laststatus=1 set listchars=eol:$ set joinspaces +set noctrldisambig set nohidden nosmarttab noautoindent noautoread complete-=i noruler noshowcmd set nrformats+=octal set shortmess-=F diff --git a/test/functional/legacy/eval_spec.lua b/test/functional/legacy/eval_spec.lua index 05d853622e..e41410db6f 100644 --- a/test/functional/legacy/eval_spec.lua +++ b/test/functional/legacy/eval_spec.lua @@ -35,7 +35,10 @@ describe('eval', function() endfun ]]) end) - before_each(clear) + before_each(function() + clear() + command('set noctrldisambig') + end) teardown(function() os.remove('test_eval_setup.vim') end) |