vim-patch:8.1.0384: sign ordering #9758

Problem:    Sign ordering depends on +netbeans feature.
Solution:   Also order signs without +netbeans. (Christian Brabandt,
            closes vim/vim#3224)
8aeb504fc6
This commit is contained in:
Jan Edmund Lazo 2019-03-19 07:42:17 -04:00 committed by Justin M. Keyes
parent 6f7b81bd6d
commit 24d7513dc4
2 changed files with 31 additions and 3 deletions

View File

@ -5037,6 +5037,10 @@ static void insert_sign(
newsign->lnum = lnum; newsign->lnum = lnum;
newsign->typenr = typenr; newsign->typenr = typenr;
newsign->next = next; newsign->next = next;
newsign->prev = prev;
if (next != NULL) {
next->prev = newsign;
}
if (prev == NULL) { if (prev == NULL) {
/* When adding first sign need to redraw the windows to create the /* When adding first sign need to redraw the windows to create the
@ -5073,12 +5077,32 @@ void buf_addsign(
sign->typenr = typenr; sign->typenr = typenr;
return; return;
} else if ((lnum == sign->lnum && id != sign->id) } else if ((lnum == sign->lnum && id != sign->id)
|| (id < 0 && lnum < sign->lnum)) { // attempt to keep signs sorted by lnum || (id < 0 && lnum < sign->lnum)) {
insert_sign(buf, prev, sign, id, lnum, typenr); // keep signs sorted by lnum: insert new sign at head of list for
return; // this lnum
while (prev != NULL && prev->lnum == lnum) {
prev = prev->prev;
}
if (prev == NULL) {
sign = buf->b_signlist;
} else {
sign = prev->next;
}
insert_sign(buf, prev, sign, id, lnum, typenr);
return;
} }
prev = sign; prev = sign;
} }
// insert new sign at head of list for this lnum
while (prev != NULL && prev->lnum == lnum) {
prev = prev->prev;
}
if (prev == NULL) {
sign = buf->b_signlist;
} else {
sign = prev->next;
}
insert_sign(buf, prev, sign, id, lnum, typenr); insert_sign(buf, prev, sign, id, lnum, typenr);
return; return;
@ -5147,6 +5171,9 @@ linenr_T buf_delsign(
next = sign->next; next = sign->next;
if (sign->id == id) { if (sign->id == id) {
*lastp = next; *lastp = next;
if (next != NULL) {
next->prev = sign->prev;
}
lnum = sign->lnum; lnum = sign->lnum;
xfree(sign); xfree(sign);
break; break;

View File

@ -13,6 +13,7 @@ struct signlist
linenr_T lnum; // line number which has this sign linenr_T lnum; // line number which has this sign
int typenr; // typenr of sign int typenr; // typenr of sign
signlist_T *next; // next signlist entry signlist_T *next; // next signlist entry
signlist_T *prev; // previous entry -- for easy reordering
}; };
// type argument for buf_getsigntype() and sign_get_attr() // type argument for buf_getsigntype() and sign_get_attr()