aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-03-19 07:42:17 -0400
committerJustin M. Keyes <justinkz@gmail.com>2019-03-19 12:42:17 +0100
commit24d7513dc44f5195290e3cfbcce2287e9b2e4564 (patch)
treec9e0991957f48d232a948b5ac4c06ce261f4b81b
parent6f7b81bd6d555a52ec310c45990a9c4caf84166f (diff)
downloadrneovim-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.c33
-rw-r--r--src/nvim/sign_defs.h1
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()