aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2021-11-04 21:43:05 +0800
committerGitHub <noreply@github.com>2021-11-04 07:43:05 -0600
commit5ce35abae6427dac7ac2b147bae8f16adcd8ddff (patch)
tree12c3c386862a59bf04404647d563156963751164
parentfd347840ba95b2709b90d5a3131f59b72fbad7fb (diff)
downloadrneovim-5ce35abae6427dac7ac2b147bae8f16adcd8ddff.tar.gz
rneovim-5ce35abae6427dac7ac2b147bae8f16adcd8ddff.tar.bz2
rneovim-5ce35abae6427dac7ac2b147bae8f16adcd8ddff.zip
fix(input): never reinterpret unmapped ALT- chrods in Terminal mode (#16222)
-rw-r--r--src/nvim/getchar.c3
-rw-r--r--test/functional/editor/meta_key_spec.lua28
2 files changed, 30 insertions, 1 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index a374406716..a04914efd5 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1579,7 +1579,8 @@ int vgetc(void)
// 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
- if (!no_mapping && KeyTyped
+ // In Terminal mode, however, this is not desirable. #16220
+ if (!no_mapping && KeyTyped && !(State & TERM_FOCUS)
&& (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META)) {
mod_mask = 0;
ins_char_typebuf(c);
diff --git a/test/functional/editor/meta_key_spec.lua b/test/functional/editor/meta_key_spec.lua
index c219204409..2280f5bb24 100644
--- a/test/functional/editor/meta_key_spec.lua
+++ b/test/functional/editor/meta_key_spec.lua
@@ -1,6 +1,8 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
local command = helpers.command
+local exec_lua = helpers.exec_lua
+local eval = helpers.eval
local expect = helpers.expect
local funcs = helpers.funcs
local eq = helpers.eq
@@ -61,4 +63,30 @@ describe('meta-keys #8226 #13042', function()
feed('u')
expect('hello')
end)
+
+ it('ALT/META terminal-mode', function()
+ exec_lua([[
+ _G.input_data = ''
+ vim.api.nvim_open_term(0, { on_input = function(_, _, _, data)
+ _G.input_data = _G.input_data .. vim.fn.strtrans(data)
+ end })
+ ]])
+ -- Mapped ALT-chord behaves as mapped.
+ command('tnoremap <M-l> meta-l')
+ command('tnoremap <A-j> alt-j')
+ feed('i<M-l> xxx <A-j>')
+ eq('meta-l xxx alt-j', exec_lua([[return _G.input_data]]))
+ -- Unmapped ALT-chord is sent to terminal as-is. #16220
+ exec_lua([[_G.input_data = '']])
+ command('tunmap <M-l>')
+ feed('<M-l>')
+ local meta_l_seq = exec_lua([[return _G.input_data]])
+ command('tnoremap <Esc> <C-\\><C-N>')
+ feed('yyy<M-l><A-j>')
+ eq(meta_l_seq .. 'yyy' .. meta_l_seq .. 'alt-j', exec_lua([[return _G.input_data]]))
+ eq('t', eval('mode(1)'))
+ feed('<Esc>j')
+ eq({ 0, 2, 1, 0, }, funcs.getpos('.'))
+ eq('nt', eval('mode(1)'))
+ end)
end)