diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-03-19 07:42:17 -0400 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-03-19 12:42:17 +0100 |
commit | 24d7513dc44f5195290e3cfbcce2287e9b2e4564 (patch) | |
tree | c9e0991957f48d232a948b5ac4c06ce261f4b81b | |
parent | 6f7b81bd6d555a52ec310c45990a9c4caf84166f (diff) | |
download | rneovim-24d7513dc44f5195290e3cfbcce2287e9b2e4564.tar.gz rneovim-24d7513dc44f5195290e3cfbcce2287e9b2e4564.tar.bz2 rneovim-24d7513dc44f5195290e3cfbcce2287e9b2e4564.zip |
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
-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() |