# HG changeset patch # User Bram Moolenaar # Date 1559854807 -7200 # Node ID 5493e31010e11543a0279bf321d64196263f2bd5 # Parent e18b1c654d099b8b80b6206e44be3a6803fc928b patch 8.1.1486: a listener change is merged even when it adds a line commit https://github.com/vim/vim/commit/125370459178b0ca3acc98edca774c390c9b9fa4 Author: Bram Moolenaar Date: Thu Jun 6 22:50:35 2019 +0200 patch 8.1.1486: a listener change is merged even when it adds a line Problem: A listener change is merged even when it adds a line. (Paul Jolly) Solution: Do not merge a change that adds or removes a line. (closes https://github.com/vim/vim/issues/4490) diff --git a/src/change.c b/src/change.c --- a/src/change.c +++ b/src/change.c @@ -186,6 +186,7 @@ check_recorded_changes( || (prev_lnume >= lnum && xtra != 0)) { if (li->li_next == NULL && lnum == prev_lnum + && xtra == 0 && col + 1 == (colnr_T)dict_get_number( li->li_tv.vval.v_dict, (char_u *)"col")) { 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 @@ -28,9 +28,10 @@ func Test_listening() set undolevels& " start new undo block call append(2, 'two two') undo + call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], s:list) redraw - " the two changes get merged - call assert_equal([{'lnum': 3, 'end': 4, 'col': 1, 'added': 0}], s:list) + " the two changes are not merged + call assert_equal([{'lnum': 3, 'end': 4, 'col': 1, 'added': -1}], s:list) 1 " Two listeners, both get called. Also check column. @@ -65,15 +66,16 @@ func Test_listening() call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) - " an insert just above a previous change that was the last one gets merged + " an insert just above a previous change that was the last one does not get + " merged call setline(1, ['one one', 'two']) call listener_flush() let s:list = [] call setline(2, 'something') call append(1, 'two two') - call assert_equal([], s:list) + call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': 0}], s:list) call listener_flush() - call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': 1}], s:list) + call assert_equal([{'lnum': 2, 'end': 2, 'col': 1, 'added': 1}], s:list) " an insert above a previous change causes a flush call setline(1, ['one one', 'two']) @@ -86,13 +88,13 @@ func Test_listening() call assert_equal([{'lnum': 1, 'end': 1, 'col': 1, 'added': 1}], s:list) call assert_equal('two two', s:text) - " a delete at a previous change that was the last one gets merged + " a delete at a previous change that was the last one does not get merged call setline(1, ['one one', 'two']) call listener_flush() let s:list = [] call setline(2, 'something') 2del - call assert_equal([], s:list) + call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': 0}], s:list) call listener_flush() call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': -1}], s:list) 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 */ /**/ + 1486, +/**/ 1485, /**/ 1484,