diff options
author | zeertzjq <zeertzjq@outlook.com> | 2021-10-10 09:15:46 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-09 18:15:46 -0700 |
commit | f4359b5dbdd5ed9aa230532382edd7eb6cd0a61b (patch) | |
tree | 60e8a3ff5d503517488510a6dd5600c12dc5b370 | |
parent | 65b8232260a1e95f53c6bf704dfa02cdd3125262 (diff) | |
download | rneovim-f4359b5dbdd5ed9aa230532382edd7eb6cd0a61b.tar.gz rneovim-f4359b5dbdd5ed9aa230532382edd7eb6cd0a61b.tar.bz2 rneovim-f4359b5dbdd5ed9aa230532382edd7eb6cd0a61b.zip |
vim-patch:8.2.3461: distinguish Normal and Terminal-Normal mode #15878
Problem: Cannot distinguish Normal and Terminal-Normal mode.
Solution: Make mode() return "nt" for Terminal-Normal mode. (issue vim/vim#8856)
https://github.com/vim/vim/commit/72406a4bd2896915b6f541e26d41521a59b1f846
-rw-r--r-- | runtime/doc/eval.txt | 2 | ||||
-rw-r--r-- | src/nvim/state.c | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 8 | ||||
-rw-r--r-- | test/functional/terminal/buffer_spec.lua | 4 | ||||
-rw-r--r-- | test/functional/terminal/ex_terminal_spec.lua | 15 | ||||
-rw-r--r-- | test/functional/terminal/mouse_spec.lua | 10 | ||||
-rw-r--r-- | test/functional/terminal/window_split_tab_spec.lua | 2 |
7 files changed, 32 insertions, 11 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index fe19bb3134..7457460fd4 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -6864,6 +6864,8 @@ mode([expr]) Return a string that indicates the current mode. niI Normal using |i_CTRL-O| in |Insert-mode| niR Normal using |i_CTRL-O| in |Replace-mode| niV Normal using |i_CTRL-O| in |Virtual-Replace-mode| + nt Normal in |terminal-emulator| (insert goes to + Terminal mode) v Visual by character vs Visual by character using |v_CTRL-O| in Select mode V Visual by line diff --git a/src/nvim/state.c b/src/nvim/state.c index 04271d750c..4eb0073873 100644 --- a/src/nvim/state.c +++ b/src/nvim/state.c @@ -195,6 +195,8 @@ char *get_mode(void) || restart_edit == 'V') { buf[1] = 'i'; buf[2] = (char)restart_edit; + } else if (curbuf->terminal) { + buf[1] = 't'; } } diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 366615821c..ed080afee6 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -710,6 +710,14 @@ func Test_mode() call assert_equal('c-cv', g:current_modes) " How to test Ex mode? + if has('terminal') + term + call feedkeys("\<C-W>N", 'xt') + call assert_equal('n', mode()) + call assert_equal('nt', mode(1)) + call feedkeys("aexit\<CR>", 'xt') + endif + bwipe! iunmap <F2> xunmap <F2> diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua index 5442724644..7dcca231ee 100644 --- a/test/functional/terminal/buffer_spec.lua +++ b/test/functional/terminal/buffer_spec.lua @@ -24,11 +24,11 @@ describe(':terminal buffer', function() feed([[<C-\><C-N>]]) command('setlocal cursorline cursorlineopt=both cursorcolumn scrolloff=4 sidescrolloff=7') eq({ 'both', 1, 1, 4, 7 }, eval('[&l:cursorlineopt, &l:cursorline, &l:cursorcolumn, &l:scrolloff, &l:sidescrolloff]')) - eq('n', eval('mode()')) + eq('nt', eval('mode(1)')) -- Enter terminal-mode ("insert" mode in :terminal). feed('i') - eq('t', eval('mode()')) + eq('t', eval('mode(1)')) eq({ 'number', 1, 0, 0, 0 }, eval('[&l:cursorlineopt, &l:cursorline, &l:cursorcolumn, &l:scrolloff, &l:sidescrolloff]')) end) diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua index 707c355069..065dd72485 100644 --- a/test/functional/terminal/ex_terminal_spec.lua +++ b/test/functional/terminal/ex_terminal_spec.lua @@ -96,19 +96,28 @@ describe(':terminal', function() eq(3, #jumps) end) + it('nvim_get_mode() in :terminal', function() + command(':terminal') + eq({ blocking=false, mode='nt' }, nvim('get_mode')) + feed('i') + eq({ blocking=false, mode='t' }, nvim('get_mode')) + feed([[<C-\><C-N>]]) + eq({ blocking=false, mode='nt' }, nvim('get_mode')) + end) + it(':stopinsert RPC request exits terminal-mode #7807', function() command(':terminal') feed('i[tui] insert-mode') eq({ blocking=false, mode='t' }, nvim('get_mode')) command('stopinsert') - eq({ blocking=false, mode='n' }, nvim('get_mode')) + eq({ blocking=false, mode='nt' }, nvim('get_mode')) end) it(':stopinsert in normal mode doesn\'t break insert mode #9889', function() command(':terminal') - eq({ blocking=false, mode='n' }, nvim('get_mode')) + eq({ blocking=false, mode='nt' }, nvim('get_mode')) command(':stopinsert') - eq({ blocking=false, mode='n' }, nvim('get_mode')) + eq({ blocking=false, mode='nt' }, nvim('get_mode')) feed('a') eq({ blocking=false, mode='t' }, nvim('get_mode')) end) diff --git a/test/functional/terminal/mouse_spec.lua b/test/functional/terminal/mouse_spec.lua index 0eb5901b3b..3d8441b93c 100644 --- a/test/functional/terminal/mouse_spec.lua +++ b/test/functional/terminal/mouse_spec.lua @@ -33,16 +33,16 @@ describe(':terminal mouse', function() describe('when the terminal has focus', function() it('will exit focus on mouse-scroll', function() - eq('t', eval('mode()')) + eq('t', eval('mode(1)')) feed('<ScrollWheelUp><0,0>') - eq('n', eval('mode()')) + eq('nt', eval('mode(1)')) end) it('will exit focus on <C-\\> + mouse-scroll', function() - eq('t', eval('mode()')) + eq('t', eval('mode(1)')) feed('<C-\\>') feed('<ScrollWheelUp><0,0>') - eq('n', eval('mode()')) + eq('nt', eval('mode(1)')) end) describe('with mouse events enabled by the program', function() @@ -94,7 +94,7 @@ describe(':terminal mouse', function() -- When the display area such as a number is clicked, it returns to the -- normal mode. feed('<LeftMouse><3,0>') - eq('n', eval('mode()')) + eq('nt', eval('mode(1)')) screen:expect([[ {7: 11 }^line28 | {7: 12 }line29 | diff --git a/test/functional/terminal/window_split_tab_spec.lua b/test/functional/terminal/window_split_tab_spec.lua index 188afa1e84..c92107082e 100644 --- a/test/functional/terminal/window_split_tab_spec.lua +++ b/test/functional/terminal/window_split_tab_spec.lua @@ -111,7 +111,7 @@ describe(':terminal', function() command('terminal') feed('a<Cmd>wincmd j<CR>') eq(2, eval("winnr()")) - eq('t', eval('mode()')) + eq('t', eval('mode(1)')) end) end) |