1
0
forked from aniani/vim

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.
This commit is contained in:
Bram Moolenaar
2019-05-24 21:39:27 +02:00
parent f0884c5f3f
commit 7b31a181c8
3 changed files with 23 additions and 6 deletions

View File

@@ -172,16 +172,20 @@ check_recorded_changes(
if (buf->b_recorded_changes != NULL && xtra != 0) if (buf->b_recorded_changes != NULL && xtra != 0)
{ {
listitem_T *li; listitem_T *li;
linenr_T nr; linenr_T prev_lnum;
linenr_T prev_lnume;
for (li = buf->b_recorded_changes->lv_first; li != NULL; for (li = buf->b_recorded_changes->lv_first; li != NULL;
li = li->li_next) 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"); 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( && col + 1 == (colnr_T)dict_get_number(
li->li_tv.vval.v_dict, (char_u *)"col")) li->li_tv.vval.v_dict, (char_u *)"col"))
{ {
@@ -195,8 +199,8 @@ check_recorded_changes(
(char_u *)"end", -1); (char_u *)"end", -1);
if (di != NULL) if (di != NULL)
{ {
nr = tv_get_number(&di->di_tv); prev_lnum = tv_get_number(&di->di_tv);
if (lnume > nr) if (lnume > prev_lnum)
di->di_tv.vval.v_number = lnume; di->di_tv.vval.v_number = lnume;
} }
di = dict_find(li->li_tv.vval.v_dict, di = dict_find(li->li_tv.vval.v_dict,

View File

@@ -187,6 +187,17 @@ func Test_listener_args()
\ {'lnum': 4, 'end': 5, 'col': 1, 'added': -1}, \ {'lnum': 4, 'end': 5, 'col': 1, 'added': -1},
\ {'lnum': 6, 'end': 6, 'col': 1, 'added': 1}], s:list) \ {'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) call listener_remove(id)
bwipe! bwipe!
endfunc endfunc

View File

@@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1389,
/**/ /**/
1388, 1388,
/**/ /**/