Skip to content

Commit

Permalink
feat(input)!: delay some conversions to vgetc()
Browse files Browse the repository at this point in the history
  • Loading branch information
zeertzjq authored and bfredl committed Mar 24, 2022
1 parent a72f338 commit d7488bf
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 7 deletions.
8 changes: 8 additions & 0 deletions src/nvim/getchar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 10 additions & 6 deletions src/nvim/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
}
}

Expand Down
1 change: 1 addition & 0 deletions src/nvim/option_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions src/nvim/options.lua
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,13 @@ return {
varname='p_csverbose',
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"),
Expand Down
1 change: 1 addition & 0 deletions src/nvim/testdir/setup.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion test/functional/legacy/eval_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit d7488bf

Please sign in to comment.