mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 9.1.1337: Undo corrupted with 'completeopt' "preinsert" when switching buffer
Problem: Undo corrupted with 'completeopt' "preinsert" when switching buffer or window. Solution: Do not delete preinsert text when switching buffer or window. (zeertzjq) related: neovim/neovim#33581 closes: #17193 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: glepnir <glephunter@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
229f79c168
commit
1343681aba
@@ -2699,7 +2699,7 @@ ins_compl_stop(int c, int prev_mode, int retval)
|
|||||||
char_u *word = NULL;
|
char_u *word = NULL;
|
||||||
|
|
||||||
// Remove pre-inserted text when present.
|
// Remove pre-inserted text when present.
|
||||||
if (ins_compl_preinsert_effect())
|
if (ins_compl_preinsert_effect() && ins_compl_win_active(curwin))
|
||||||
ins_compl_delete();
|
ins_compl_delete();
|
||||||
|
|
||||||
// Get here when we have finished typing a sequence of ^N and
|
// Get here when we have finished typing a sequence of ^N and
|
||||||
|
@@ -3833,7 +3833,7 @@ func Test_complete_info_completed()
|
|||||||
set cot&
|
set cot&
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function Test_completeopt_preinsert()
|
func Test_completeopt_preinsert()
|
||||||
func Omni_test(findstart, base)
|
func Omni_test(findstart, base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
return col(".")
|
return col(".")
|
||||||
@@ -3973,6 +3973,47 @@ function Test_completeopt_preinsert()
|
|||||||
call assert_equal(4, g:col)
|
call assert_equal(4, g:col)
|
||||||
call assert_equal("wp.", getline('.'))
|
call assert_equal("wp.", getline('.'))
|
||||||
|
|
||||||
|
%delete _
|
||||||
|
let &l:undolevels = &l:undolevels
|
||||||
|
normal! ifoo
|
||||||
|
let &l:undolevels = &l:undolevels
|
||||||
|
normal! obar
|
||||||
|
let &l:undolevels = &l:undolevels
|
||||||
|
normal! obaz
|
||||||
|
let &l:undolevels = &l:undolevels
|
||||||
|
|
||||||
|
func CheckUndo()
|
||||||
|
let g:errmsg = ''
|
||||||
|
call assert_equal(['foo', 'bar', 'baz'], getline(1, '$'))
|
||||||
|
undo
|
||||||
|
call assert_equal(['foo', 'bar'], getline(1, '$'))
|
||||||
|
undo
|
||||||
|
call assert_equal(['foo'], getline(1, '$'))
|
||||||
|
undo
|
||||||
|
call assert_equal([''], getline(1, '$'))
|
||||||
|
later 3
|
||||||
|
call assert_equal(['foo', 'bar', 'baz'], getline(1, '$'))
|
||||||
|
call assert_equal('', v:errmsg)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Check that switching buffer with "preinsert" doesn't corrupt undo.
|
||||||
|
new
|
||||||
|
setlocal bufhidden=wipe
|
||||||
|
inoremap <buffer> <F2> <Cmd>enew!<CR>
|
||||||
|
call feedkeys("i\<C-X>\<C-O>\<F2>\<Esc>", 'tx')
|
||||||
|
bwipe!
|
||||||
|
call CheckUndo()
|
||||||
|
|
||||||
|
" Check that closing window with "preinsert" doesn't corrupt undo.
|
||||||
|
new
|
||||||
|
setlocal bufhidden=wipe
|
||||||
|
inoremap <buffer> <F2> <Cmd>close!<CR>
|
||||||
|
call feedkeys("i\<C-X>\<C-O>\<F2>\<Esc>", 'tx')
|
||||||
|
call CheckUndo()
|
||||||
|
|
||||||
|
%delete _
|
||||||
|
delfunc CheckUndo
|
||||||
|
|
||||||
bw!
|
bw!
|
||||||
set cot&
|
set cot&
|
||||||
set omnifunc&
|
set omnifunc&
|
||||||
|
@@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1337,
|
||||||
/**/
|
/**/
|
||||||
1336,
|
1336,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user