Skip to content

Commit d7ae263

Browse files
echasnovskichrisbra
authored andcommitted
patch 9.0.2031: TextChangedI may be triggered by non-insert mode change
Problem: `TextChangedI` can trigger on entering Insert mode if there was previously a change not in Insert mode. Solution: Make it trigger only when text is actually changed in Insert mode. closes: #13265 closes: #13338 Signed-off-by: Christian Brabandt <[email protected]> Co-authored-by: Evgeni Chasnovski <[email protected]>
1 parent 47510f3 commit d7ae263

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

src/edit.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ edit(
174174
return FALSE;
175175
}
176176
ins_compl_clear(); // clear stuff for CTRL-X mode
177+
// Reset Changedtick_i, so that TextChangedI will only be triggered for stuff
178+
// from insert mode
179+
curbuf->b_last_changedtick_i = CHANGEDTICK(curbuf);
177180

178181
/*
179182
* Trigger InsertEnter autocommands. Do not do this for "r<CR>" or "grx".
@@ -840,6 +843,7 @@ edit(
840843
if (cmdchar != 'r' && cmdchar != 'v' && c != Ctrl_C)
841844
ins_apply_autocmds(EVENT_INSERTLEAVE);
842845
did_cursorhold = FALSE;
846+
curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
843847
return (c == Ctrl_O);
844848
}
845849
continue;

src/testdir/test_autocmd.vim

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,27 +2566,28 @@ func Test_ChangedP()
25662566
call cursor(3, 1)
25672567
let g:autocmd = ''
25682568
call feedkeys("o\<esc>", 'tnix')
2569-
call assert_equal('I', g:autocmd)
2569+
" `TextChangedI` triggers only if text is actually changed in Insert mode
2570+
call assert_equal('', g:autocmd)
25702571

25712572
let g:autocmd = ''
25722573
call feedkeys("Sf", 'tnix')
2573-
call assert_equal('II', g:autocmd)
2574+
call assert_equal('I', g:autocmd)
25742575

25752576
let g:autocmd = ''
25762577
call feedkeys("Sf\<C-N>", 'tnix')
2577-
call assert_equal('IIP', g:autocmd)
2578+
call assert_equal('IP', g:autocmd)
25782579

25792580
let g:autocmd = ''
25802581
call feedkeys("Sf\<C-N>\<C-N>", 'tnix')
2581-
call assert_equal('IIPP', g:autocmd)
2582+
call assert_equal('IPP', g:autocmd)
25822583

25832584
let g:autocmd = ''
25842585
call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix')
2585-
call assert_equal('IIPPP', g:autocmd)
2586+
call assert_equal('IPPP', g:autocmd)
25862587

25872588
let g:autocmd = ''
25882589
call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix')
2589-
call assert_equal('IIPPPP', g:autocmd)
2590+
call assert_equal('IPPPP', g:autocmd)
25902591

25912592
call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$'))
25922593
" TODO: how should it handle completeopt=noinsert,noselect?
@@ -3610,6 +3611,16 @@ func Test_Changed_ChangedI()
36103611
" call assert_equal('N4', g:autocmd_n)
36113612
call assert_equal('I3', g:autocmd_i)
36123613

3614+
" TextChangedI should only trigger if change was done in Insert mode
3615+
let g:autocmd_i = ''
3616+
call feedkeys("yypi\<esc>", 'tnix')
3617+
call assert_equal('', g:autocmd_i)
3618+
3619+
" TextChanged should only trigger if change was done in Normal mode
3620+
let g:autocmd_n = ''
3621+
call feedkeys("ibar\<esc>", 'tnix')
3622+
call assert_equal('', g:autocmd_n)
3623+
36133624
" CleanUp
36143625
call test_override("char_avail", 0)
36153626
au! TextChanged <buffer>

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,8 @@ static char *(features[]) =
704704

705705
static int included_patches[] =
706706
{ /* Add new patch number below this line */
707+
/**/
708+
2031,
707709
/**/
708710
2030,
709711
/**/

0 commit comments

Comments
 (0)