# HG changeset patch # User Bram Moolenaar # Date 1558727105 -7200 # Node ID 0cc3f459237bc1e0042a988c1ef0cad2d266b32e # Parent cb22e7579bd7919ea858a3a6b0a9d3f26bb4cb82 patch 8.1.1389: changes are not flushed when end and start overlap commit https://github.com/vim/vim/commit/7b31a181c84ec6b9050892e80f3132907569f8d8 Author: Bram Moolenaar Date: Fri May 24 21:39:27 2019 +0200 patch 8.1.1389: changes are not flushed when end and start overlap Problem: Changes are not flushed when end and start overlap. (Paul Jolly) Solution: When end of a previous changes overlaps with start of a new change, first flush listeners. diff --git a/src/change.c b/src/change.c --- a/src/change.c +++ b/src/change.c @@ -172,16 +172,20 @@ check_recorded_changes( if (buf->b_recorded_changes != NULL && xtra != 0) { listitem_T *li; - linenr_T nr; + linenr_T prev_lnum; + linenr_T prev_lnume; for (li = buf->b_recorded_changes->lv_first; li != NULL; li = li->li_next) { - nr = (linenr_T)dict_get_number( + prev_lnum = (linenr_T)dict_get_number( li->li_tv.vval.v_dict, (char_u *)"lnum"); - if (nr >= lnum || nr > lnume) + prev_lnume = (linenr_T)dict_get_number( + li->li_tv.vval.v_dict, (char_u *)"end"); + if (prev_lnum >= lnum || prev_lnum > lnume + || (prev_lnume >= lnum && xtra != 0)) { - if (li->li_next == NULL && lnum == nr + if (li->li_next == NULL && lnum == prev_lnum && col + 1 == (colnr_T)dict_get_number( li->li_tv.vval.v_dict, (char_u *)"col")) { @@ -195,8 +199,8 @@ check_recorded_changes( (char_u *)"end", -1); if (di != NULL) { - nr = tv_get_number(&di->di_tv); - if (lnume > nr) + prev_lnum = tv_get_number(&di->di_tv); + if (lnume > prev_lnum) di->di_tv.vval.v_number = lnume; } di = dict_find(li->li_tv.vval.v_dict, diff --git a/src/testdir/test_listener.vim b/src/testdir/test_listener.vim --- a/src/testdir/test_listener.vim +++ b/src/testdir/test_listener.vim @@ -187,6 +187,17 @@ func Test_listener_args() \ {'lnum': 4, 'end': 5, 'col': 1, 'added': -1}, \ {'lnum': 6, 'end': 6, 'col': 1, 'added': 1}], s:list) + " split a line then insert one, should get two disconnected change lists + call setline(1, 'split here') + call listener_flush() + let s:list = [] + exe "normal 1ggwi\\" + 1 + normal o + call assert_equal([{'lnum': 1, 'end': 2, 'col': 7, 'added': 1}], s:list) + call listener_flush() + call assert_equal([{'lnum': 2, 'end': 2, 'col': 1, 'added': 1}], s:list) + call listener_remove(id) bwipe! endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1389, +/**/ 1388, /**/ 1387,