changeset 16774:0cc3f459237b v8.1.1389

patch 8.1.1389: changes are not flushed when end and start overlap commit https://github.com/vim/vim/commit/7b31a181c84ec6b9050892e80f3132907569f8d8 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Fri, 24 May 2019 21:45:05 +0200
parents cb22e7579bd7
children f88e274120e4
files src/change.c src/testdir/test_listener.vim src/version.c
diffstat 3 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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,
--- 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\<CR>\<Esc>"
+  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
--- 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,