diff options
-rw-r--r-- | src/nvim/buffer.c | 33 | ||||
-rw-r--r-- | src/nvim/sign_defs.h | 1 |
2 files changed, 31 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; diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h index 4443fd8a2e..b4f2709d45 100644 --- a/src/nvim/sign_defs.h +++ b/src/nvim/sign_defs.h @@ -13,6 +13,7 @@ struct signlist linenr_T lnum; // line number which has this sign int typenr; // typenr of sign signlist_T *next; // next signlist entry + signlist_T *prev; // previous entry -- for easy reordering }; // type argument for buf_getsigntype() and sign_get_attr() |