From 24d7513dc44f5195290e3cfbcce2287e9b2e4564 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Tue, 19 Mar 2019 07:42:17 -0400 Subject: [PATCH] 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) https://github.com/vim/vim/commit/8aeb504fc68e3fea9da5567d2d9a31a132fbf90f --- src/nvim/buffer.c | 33 ++++++++++++++++++++++++++++++--- 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()