summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-24 21:39:27 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-24 21:39:27 +0200
commit7b31a181c84ec6b9050892e80f3132907569f8d8 (patch)
tree1d12931fd5662f6c266b6e7fdcc620d2c82d6437
parentf0884c5f3f5a25481d1e16f0979aa978a6690bb1 (diff)
patch 8.1.1389: changes are not flushed when end and start overlapv8.1.1389
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.
-rw-r--r--src/change.c16
-rw-r--r--src/testdir/test_listener.vim11
-rw-r--r--src/version.c2
3 files changed, 23 insertions, 6 deletions
diff --git a/src/change.c b/src/change.c
index 8f0cacb450..0873dd3d89 100644
--- 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
index 66c3d51439..16c4c0022c 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 81b7486bd0..03ad4bcdf0 100644
--- 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,