diff options
Diffstat (limited to 'src/nvim/buffer.c')
-rw-r--r-- | src/nvim/buffer.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 8cb4e32815..e333f552a8 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -5037,6 +5037,10 @@ static void insert_sign( newsign->lnum = lnum; newsign->typenr = typenr; newsign->next = next; + newsign->prev = prev; + if (next != NULL) { + next->prev = newsign; + } if (prev == NULL) { /* When adding first sign need to redraw the windows to create the @@ -5073,12 +5077,32 @@ void buf_addsign( sign->typenr = typenr; return; } else if ((lnum == sign->lnum && id != sign->id) - || (id < 0 && lnum < sign->lnum)) { // attempt to keep signs sorted by lnum - insert_sign(buf, prev, sign, id, lnum, typenr); - return; + || (id < 0 && lnum < sign->lnum)) { + // keep signs sorted by lnum: 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); + return; } 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); return; @@ -5147,6 +5171,9 @@ linenr_T buf_delsign( next = sign->next; if (sign->id == id) { *lastp = next; + if (next != NULL) { + next->prev = sign->prev; + } lnum = sign->lnum; xfree(sign); break; |