aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-03-06 07:52:11 +0800
committerGitHub <noreply@github.com>2023-03-06 07:52:11 +0800
commite389b189021cb6b72cfd7583ce6fb5d8d3346d45 (patch)
treef5f58f759ac4bbd8bd00d5684b7ba079f1946db9
parent533d671271eb76373d9940161e7bfd201b7e7c2b (diff)
downloadrneovim-e389b189021cb6b72cfd7583ce6fb5d8d3346d45.tar.gz
rneovim-e389b189021cb6b72cfd7583ce6fb5d8d3346d45.tar.bz2
rneovim-e389b189021cb6b72cfd7583ce6fb5d8d3346d45.zip
vim-patch:9.0.1385: g'Esc is considered an error (#22544)
Problem: g'Esc is considered an error. Solution: Make g'Esc silently abandon the command. (closes vim/vim#12110) https://github.com/vim/vim/commit/f86dea8119f3141e3d2c680219036d1511101f9b
-rw-r--r--src/nvim/normal.c7
-rw-r--r--src/nvim/testdir/test_normal.vim37
-rw-r--r--test/functional/ui/mode_spec.lua22
3 files changed, 62 insertions, 4 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index f7c99d5991..890215e754 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -963,7 +963,8 @@ normal_end:
may_trigger_modechanged();
// Redraw the cursor with another shape, if we were in Operator-pending
// mode or did a replace command.
- if (s->c || s->ca.cmdchar == 'r') {
+ if (s->c || s->ca.cmdchar == 'r'
+ || (s->ca.cmdchar == 'g' && s->ca.nchar == 'r')) {
ui_cursor_shape(); // may show different cursor shape
}
@@ -1162,7 +1163,7 @@ static int normal_execute(VimState *state, int key)
State = MODE_NORMAL;
- if (s->ca.nchar == ESC) {
+ if (s->ca.nchar == ESC || s->ca.extra_char == ESC) {
clearop(&s->oa);
s->command_finished = true;
goto finish;
@@ -4706,7 +4707,7 @@ static void nv_vreplace(cmdarg_T *cap)
return;
}
- if (checkclearopq(cap->oap) || cap->extra_char == ESC) {
+ if (checkclearopq(cap->oap)) {
return;
}
diff --git a/src/nvim/testdir/test_normal.vim b/src/nvim/testdir/test_normal.vim
index 5d8e1913a2..582596748f 100644
--- a/src/nvim/testdir/test_normal.vim
+++ b/src/nvim/testdir/test_normal.vim
@@ -2540,6 +2540,8 @@ func Test_normal33_g_cmd2()
norm! g'a
call assert_equal('>', a[-1:])
call assert_equal(1, line('.'))
+ call assert_nobeep("normal! g`\<Esc>")
+ call assert_nobeep("normal! g'\<Esc>")
" Test for g; and g,
norm! g;
@@ -3315,7 +3317,8 @@ func Test_gr_command()
set modifiable&
call assert_nobeep("normal! gr\<Esc>")
- call assert_beeps("normal! cgr\<Esc>")
+ call assert_nobeep("normal! cgr\<Esc>")
+ call assert_beeps("normal! cgrx")
call assert_equal('zxxxx line l', getline(1))
exe "normal! 2|gr\<C-V>\<Esc>"
@@ -3895,4 +3898,36 @@ func Test_mouse_shape_after_failed_change()
call delete('Xmouseshapes')
endfunc
+" Test that mouse shape is restored to Normal mode after cancelling "gr".
+func Test_mouse_shape_after_cancelling_gr()
+ CheckFeature mouseshape
+ CheckCanRunGui
+
+ let lines =<< trim END
+ vim9script
+ var mouse_shapes = []
+
+ feedkeys('gr')
+ timer_start(50, (_) => {
+ mouse_shapes += [getmouseshape()]
+ timer_start(50, (_) => {
+ feedkeys("\<Esc>")
+ timer_start(50, (_) => {
+ mouse_shapes += [getmouseshape()]
+ timer_start(50, (_) => {
+ writefile(mouse_shapes, 'Xmouseshapes')
+ quit
+ })
+ })
+ })
+ })
+ END
+ call writefile(lines, 'Xmouseshape.vim', 'D')
+ call RunVim([], [], "-g -S Xmouseshape.vim")
+ sleep 300m
+ call assert_equal(['beam', 'arrow'], readfile('Xmouseshapes'))
+
+ call delete('Xmouseshapes')
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/test/functional/ui/mode_spec.lua b/test/functional/ui/mode_spec.lua
index cf4eb034e0..e870d6f25f 100644
--- a/test/functional/ui/mode_spec.lua
+++ b/test/functional/ui/mode_spec.lua
@@ -44,7 +44,10 @@ describe('ui mode_change event', function()
{0:~ }|
|
]], mode="normal"}
+ end)
+ -- oldtest: Test_mouse_shape_after_failed_change()
+ it('is restored to Normal mode after failed "c"', function()
screen:try_resize(50, 4)
command('set nomodifiable')
@@ -65,6 +68,25 @@ describe('ui mode_change event', function()
]], mode="normal"}
end)
+ -- oldtest: Test_mouse_shape_after_cancelling_gr()
+ it('is restored to Normal mode after cancelling "gr"', function()
+ feed('gr')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="replace"}
+
+ feed('<Esc>')
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], mode="normal"}
+ end)
+
it('works in insert mode', function()
feed('i')
screen:expect{grid=[[