diff options
| -rw-r--r-- | src/nvim/edit.c | 9 | ||||
| -rw-r--r-- | src/nvim/testdir/test_autocmd.vim | 28 | 
2 files changed, 36 insertions, 1 deletions
| diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 7279110444..4d487041b8 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1392,11 +1392,20 @@ ins_redraw (        && !pum_visible()) {      aco_save_T aco; +    // Sync undo when the autocommand calls setline() or append(), so that +    // it can be undone separately. +    u_sync_once = 2; +      // save and restore curwin and curbuf, in case the autocmd changes them      aucmd_prepbuf(&aco, curbuf);      apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, false, curbuf);      aucmd_restbuf(&aco);      curbuf->b_last_changedtick = buf_get_changedtick(curbuf); + +    if (u_sync_once == 1) { +      ins_need_undo = true; +    } +    u_sync_once = 0;    }    // Trigger TextChangedP if changedtick differs. When the popupmenu closes diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index 772b3f721c..547ffe5a46 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -567,7 +567,7 @@ func Test_OptionSet()    " Cleanup    au! OptionSet    for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp'] -    exe printf(":set %s&vi", opt) +    exe printf(":set %s&vim", opt)    endfor    call test_override('starting', 0)    delfunc! AutoCommandOptionSet @@ -1221,3 +1221,29 @@ func Test_ChangedP()    bw!  endfunc + +let g:setline_handled = v:false +func! SetLineOne() +  if !g:setline_handled +    call setline(1, "(x)") +    let g:setline_handled = v:true +  endif +endfunc + +func Test_TextChangedI_with_setline() +  throw 'skipped: Nvim does not support test_override()' +  new +  call test_override('char_avail', 1) +  autocmd TextChangedI <buffer> call SetLineOne() +  call feedkeys("i(\<CR>\<Esc>", 'tx') +  call assert_equal('(', getline(1)) +  call assert_equal('x)', getline(2)) +  undo +  call assert_equal('(', getline(1)) +  call assert_equal('', getline(2)) +  undo +  call assert_equal('', getline(1)) + +  call test_override('starting', 0) +  bwipe! +endfunc | 
