aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-01-30 07:56:54 +0800
committerbfredl <bjorn.linse@gmail.com>2022-03-24 11:02:39 +0100
commitd7488bf38677b5d6b1df3a88e45b3d2f21527eb4 (patch)
tree5b436b807d7aaa6f9e2eb4ab5d5c9cde58e908a5
parenta72f338d76c871869712518df862c85d1df25f54 (diff)
downloadrneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.tar.gz
rneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.tar.bz2
rneovim-d7488bf38677b5d6b1df3a88e45b3d2f21527eb4.zip
feat(input)!: delay some conversions to vgetc()
-rw-r--r--src/nvim/getchar.c8
-rw-r--r--src/nvim/keymap.c16
-rw-r--r--src/nvim/option_defs.h1
-rw-r--r--src/nvim/options.lua7
-rw-r--r--src/nvim/testdir/setup.vim1
-rw-r--r--test/functional/legacy/eval_spec.lua5
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)