aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-03-26 09:24:04 +0800
committerGitHub <noreply@github.com>2023-03-26 09:24:04 +0800
commit4eef5ac453866dae7c03f5432fc8c4dfcda19f54 (patch)
tree5659978e15435ae63f445fabef685853e78b28ea
parente3dab4b32609c63adfbb6bb425a4b19c1ff95cde (diff)
downloadrneovim-4eef5ac453866dae7c03f5432fc8c4dfcda19f54.tar.gz
rneovim-4eef5ac453866dae7c03f5432fc8c4dfcda19f54.tar.bz2
rneovim-4eef5ac453866dae7c03f5432fc8c4dfcda19f54.zip
vim-patch:9.0.1428: cursor in wrong position when leaving insert mode (#22786)
Problem: Cursor in wrong position when leaving insert mode. Solution: Update the w_valid flags. Position the cursor also when not redrawing. (closes vim/vim#12137) https://github.com/vim/vim/commit/c174c2e58c9e24a75b189e01143e6d057b84e96e Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r--src/nvim/edit.c1
-rw-r--r--src/nvim/normal.c1
-rw-r--r--test/functional/editor/mode_insert_spec.lua30
-rw-r--r--test/functional/legacy/edit_spec.lua64
-rw-r--r--test/old/testdir/test_edit.vim17
5 files changed, 102 insertions, 11 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 7bc71c1477..0983d025e5 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -3457,6 +3457,7 @@ static bool ins_esc(long *count, int cmdchar, bool nomove)
}
} else {
curwin->w_cursor.col--;
+ curwin->w_valid &= ~(VALID_WCOL|VALID_VIRTCOL);
// Correct cursor for multi-byte character.
mb_adjust_cursor();
}
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 605b0aee68..6ad1cbd987 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -1377,6 +1377,7 @@ static int normal_check(VimState *state)
// update cursor and redraw.
if (skip_redraw || exmode_active) {
skip_redraw = false;
+ setcursor();
} else if (do_redraw || stuff_empty()) {
// Ensure curwin->w_topline and curwin->w_leftcol are up to date
// before triggering a WinScrolled autocommand.
diff --git a/test/functional/editor/mode_insert_spec.lua b/test/functional/editor/mode_insert_spec.lua
index b00661ac3a..6f16b4e685 100644
--- a/test/functional/editor/mode_insert_spec.lua
+++ b/test/functional/editor/mode_insert_spec.lua
@@ -53,14 +53,13 @@ describe('insert-mode', function()
it('double quote is removed after hit-enter prompt #22609', function()
local screen = Screen.new(60, 6)
screen:set_default_attr_ids({
- [0] = {bold = true, foreground = Screen.colors.Blue},
- [1] = {foreground = Screen.colors.Blue},
+ [0] = {bold = true, foreground = Screen.colors.Blue}, -- NonText
+ [1] = {foreground = Screen.colors.Blue}, -- SpecialKey
[2] = {foreground = Screen.colors.SlateBlue},
- [3] = {bold = true},
- [4] = {reverse = true, bold = true},
- [5] = {background = Screen.colors.Red, foreground = Screen.colors.Red},
- [6] = {background = Screen.colors.Red, foreground = Screen.colors.White},
- [7] = {foreground = Screen.colors.SeaGreen, bold = true},
+ [3] = {bold = true}, -- ModeMsg
+ [4] = {reverse = true, bold = true}, -- MsgSeparator
+ [5] = {background = Screen.colors.Red, foreground = Screen.colors.White}, -- ErrorMsg
+ [6] = {foreground = Screen.colors.SeaGreen, bold = true}, -- MoreMsg
})
screen:attach()
feed('i<C-R>')
@@ -72,14 +71,23 @@ describe('insert-mode', function()
{0:~ }|
{3:-- INSERT --} |
]])
- feed('={}<CR>')
+ feed('={}')
+ screen:expect([[
+ {1:"} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ ={2:{}}^ |
+ ]])
+ feed('<CR>')
screen:expect([[
{1:"} |
{0:~ }|
{4: }|
- ={5:{}{2:}} |
- {6:E731: using Dictionary as a String} |
- {7:Press ENTER or type command to continue}^ |
+ ={2:{}} |
+ {5:E731: using Dictionary as a String} |
+ {6:Press ENTER or type command to continue}^ |
]])
feed('<CR>')
screen:expect([[
diff --git a/test/functional/legacy/edit_spec.lua b/test/functional/legacy/edit_spec.lua
index 362d33a0fd..a0d8ca63a2 100644
--- a/test/functional/legacy/edit_spec.lua
+++ b/test/functional/legacy/edit_spec.lua
@@ -55,4 +55,68 @@ describe('edit', function()
=^ |
]])
end)
+
+ -- oldtest: Test_edit_ctrl_r_failed()
+ it('positioning cursor after CTRL-R expression failed', function()
+ local screen = Screen.new(60, 6)
+ screen:set_default_attr_ids({
+ [0] = {bold = true, foreground = Screen.colors.Blue}, -- NonText
+ [1] = {foreground = Screen.colors.Blue}, -- SpecialKey
+ [2] = {foreground = Screen.colors.SlateBlue},
+ [3] = {bold = true}, -- ModeMsg
+ [4] = {reverse = true, bold = true}, -- MsgSeparator
+ [5] = {background = Screen.colors.Red, foreground = Screen.colors.White}, -- ErrorMsg
+ [6] = {foreground = Screen.colors.SeaGreen, bold = true}, -- MoreMsg
+ })
+ screen:attach()
+
+ feed('i<C-R>')
+ screen:expect([[
+ {1:^"} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:-- INSERT --} |
+ ]])
+ feed('={}')
+ screen:expect([[
+ {1:"} |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ ={2:{}}^ |
+ ]])
+ -- trying to insert a dictionary produces an error
+ feed('<CR>')
+ screen:expect([[
+ {1:"} |
+ {0:~ }|
+ {4: }|
+ ={2:{}} |
+ {5:E731: using Dictionary as a String} |
+ {6:Press ENTER or type command to continue}^ |
+ ]])
+
+ feed(':')
+ screen:expect([[
+ :^ |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {3:-- INSERT --} |
+ ]])
+ -- ending Insert mode should put the cursor back on the ':'
+ feed('<Esc>')
+ screen:expect([[
+ ^: |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
end)
diff --git a/test/old/testdir/test_edit.vim b/test/old/testdir/test_edit.vim
index e4c21d9932..24afda67f2 100644
--- a/test/old/testdir/test_edit.vim
+++ b/test/old/testdir/test_edit.vim
@@ -5,6 +5,7 @@ if exists("+t_kD")
endif
source check.vim
+source screendump.vim
" Needed for testing basic rightleft: Test_edit_rightleft
source view_util.vim
@@ -1978,6 +1979,22 @@ func Test_edit_insert_reg()
close!
endfunc
+" Test for positioning cursor after CTRL-R expression failed
+func Test_edit_ctrl_r_failed()
+ CheckRunVimInTerminal
+
+ let buf = RunVimInTerminal('', #{rows: 6, cols: 60})
+
+ " trying to insert a dictionary produces an error
+ call term_sendkeys(buf, "i\<C-R>={}\<CR>")
+
+ " ending Insert mode should put the cursor back on the ':'
+ call term_sendkeys(buf, ":\<Esc>")
+ call VerifyScreenDump(buf, 'Test_edit_ctlr_r_failed_1', {})
+
+ call StopVimInTerminal(buf)
+endfunc
+
" When a character is inserted at the last position of the last line in a
" window, the window contents should be scrolled one line up. If the top line
" is part of a fold, then the entire fold should be scrolled up.