mirror of
https://github.com/neovim/neovim.git
synced 2025-11-26 20:20:42 +00:00
vim-patch:9.1.1221: Wrong cursor pos when leaving Insert mode just after 'autoindent' (#32976)
Problem: Wrong cursor position and '^' mark when leaving Insert mode
just after 'autoindent' and cursor on last char of line.
Solution: Don't move cursor to NUL when it wasn't moved to the left
(zeertzjq).
fixes: vim/vim#15581
related: neovim/neovim#30165 neovim/neovim#32943
closes: vim/vim#16922
a3a7d10bfb
This commit is contained in:
@@ -466,6 +466,64 @@ func Test_autoindent_remove_indent()
|
||||
call delete('Xarifile')
|
||||
endfunc
|
||||
|
||||
func Test_edit_esc_after_CR_autoindent()
|
||||
new
|
||||
setlocal autoindent
|
||||
autocmd InsertLeavePre * let g:prev_cursor = getpos('.')
|
||||
|
||||
call setline(1, 'foobar')
|
||||
exe "normal! $hi\<CR>\<Esc>"
|
||||
call assert_equal(['foob', 'ar'], getline(1, '$'))
|
||||
call assert_equal([0, 2, 1, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 1, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 1, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
call setline(1, 'foobar')
|
||||
exe "normal! $i\<CR>\<Esc>"
|
||||
call assert_equal(['fooba', 'r'], getline(1, '$'))
|
||||
call assert_equal([0, 2, 1, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 1, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 1, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
call setline(1, 'foobar')
|
||||
exe "normal! A\<CR>\<Esc>"
|
||||
call assert_equal(['foobar', ''], getline(1, '$'))
|
||||
call assert_equal([0, 2, 1, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 1, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 1, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
call setline(1, ' foobar')
|
||||
exe "normal! $hi\<CR>\<Esc>"
|
||||
call assert_equal([' foob', ' ar'], getline(1, '$'))
|
||||
call assert_equal([0, 2, 2, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 3, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 3, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
call setline(1, ' foobar')
|
||||
exe "normal! $i\<CR>\<Esc>"
|
||||
call assert_equal([' fooba', ' r'], getline(1, '$'))
|
||||
call assert_equal([0, 2, 2, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 3, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 3, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
call setline(1, ' foobar')
|
||||
exe "normal! A\<CR>\<Esc>"
|
||||
call assert_equal([' foobar', ''], getline(1, '$'))
|
||||
call assert_equal([0, 2, 1, 0], getpos('.'))
|
||||
call assert_equal([0, 2, 1, 0], getpos("'^"))
|
||||
call assert_equal([0, 2, 1, 0], g:prev_cursor)
|
||||
%d
|
||||
|
||||
autocmd! InsertLeavePre
|
||||
unlet g:prev_cursor
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_edit_CR()
|
||||
" Test for <CR> in insert mode
|
||||
" basically only in quickfix mode it's tested, the rest
|
||||
|
||||
Reference in New Issue
Block a user