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)

f86dea8119
This commit is contained in:
zeertzjq 2023-03-06 07:52:11 +08:00 committed by GitHub
parent 533d671271
commit e389b18902
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 4 deletions

View File

@ -963,7 +963,8 @@ normal_end:
may_trigger_modechanged(); may_trigger_modechanged();
// Redraw the cursor with another shape, if we were in Operator-pending // Redraw the cursor with another shape, if we were in Operator-pending
// mode or did a replace command. // 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 ui_cursor_shape(); // may show different cursor shape
} }
@ -1162,7 +1163,7 @@ static int normal_execute(VimState *state, int key)
State = MODE_NORMAL; State = MODE_NORMAL;
if (s->ca.nchar == ESC) { if (s->ca.nchar == ESC || s->ca.extra_char == ESC) {
clearop(&s->oa); clearop(&s->oa);
s->command_finished = true; s->command_finished = true;
goto finish; goto finish;
@ -4706,7 +4707,7 @@ static void nv_vreplace(cmdarg_T *cap)
return; return;
} }
if (checkclearopq(cap->oap) || cap->extra_char == ESC) { if (checkclearopq(cap->oap)) {
return; return;
} }

View File

@ -2540,6 +2540,8 @@ func Test_normal33_g_cmd2()
norm! g'a norm! g'a
call assert_equal('>', a[-1:]) call assert_equal('>', a[-1:])
call assert_equal(1, line('.')) call assert_equal(1, line('.'))
call assert_nobeep("normal! g`\<Esc>")
call assert_nobeep("normal! g'\<Esc>")
" Test for g; and g, " Test for g; and g,
norm! g; norm! g;
@ -3315,7 +3317,8 @@ func Test_gr_command()
set modifiable& set modifiable&
call assert_nobeep("normal! gr\<Esc>") 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)) call assert_equal('zxxxx line l', getline(1))
exe "normal! 2|gr\<C-V>\<Esc>" exe "normal! 2|gr\<C-V>\<Esc>"
@ -3895,4 +3898,36 @@ func Test_mouse_shape_after_failed_change()
call delete('Xmouseshapes') call delete('Xmouseshapes')
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@ -44,7 +44,10 @@ describe('ui mode_change event', function()
{0:~ }| {0:~ }|
| |
]], mode="normal"} ]], 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) screen:try_resize(50, 4)
command('set nomodifiable') command('set nomodifiable')
@ -65,6 +68,25 @@ describe('ui mode_change event', function()
]], mode="normal"} ]], mode="normal"}
end) 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() it('works in insert mode', function()
feed('i') feed('i')
screen:expect{grid=[[ screen:expect{grid=[[