diff options
-rw-r--r-- | src/nvim/buffer.c | 12 | ||||
-rw-r--r-- | src/nvim/sign.c | 34 |
2 files changed, 24 insertions, 22 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 1f4a1e0cd1..39242b0575 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -5261,7 +5261,7 @@ static int sign_compare(const void *a1, const void *a2) const signlist_T *s1 = *(const signlist_T **)a1; const signlist_T *s2 = *(const signlist_T **)a2; - // Sort by line number and the by id + // Sort by line number, priority and id if (s1->lnum > s2->lnum) { return 1; @@ -5269,12 +5269,18 @@ static int sign_compare(const void *a1, const void *a2) if (s1->lnum < s2->lnum) { return -1; } - if (s1->id > s2->id) { + if (s1->priority > s2->priority) { + return -1; + } + if (s1->priority < s2->priority) { return 1; } - if (s1->id < s2->id) { + if (s1->id > s2->id) { return -1; } + if (s1->id < s2->id) { + return 1; + } return 0; } diff --git a/src/nvim/sign.c b/src/nvim/sign.c index b2f235d0be..dc4c322a19 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -212,18 +212,18 @@ static void insert_sign( newsign->id = id; newsign->lnum = lnum; newsign->typenr = typenr; - if (group != NULL) + if (group != NULL) + { + newsign->group = sign_group_ref(group); + if (newsign->group == NULL) { - newsign->group = sign_group_ref(group); - if (newsign->group == NULL) - { - xfree(newsign); - return; - } + xfree(newsign); + return; } - else - newsign->group = NULL; - newsign->priority = prio; + } + else + newsign->group = NULL; + newsign->priority = prio; newsign->next = next; newsign->prev = prev; if (next != NULL) { @@ -331,8 +331,7 @@ void buf_addsign( // Update an existing sign sign->typenr = typenr; return; - } else if ((lnum == sign->lnum && id != sign->id) - || (id < 0 && lnum < sign->lnum)) { + } else if (lnum < sign->lnum) { insert_sign_by_lnum_prio(buf, prev, id, groupname, prio, lnum, typenr); return; } @@ -407,23 +406,20 @@ int buf_getsigntype(buf_T *buf, linenr_T lnum, SignType type, && sign_get_attr(sign->typenr, SIGN_NUMHL) != 0))) { matches[nr_matches] = sign; nr_matches++; - - if (nr_matches == ARRAY_SIZE(matches)) { + // signlist is sorted with most important (priority, id), thus we + // may stop as soon as we have max_signs matches + if (nr_matches == ARRAY_SIZE(matches) || nr_matches >= max_signs) { break; } } } if (nr_matches > 0) { - if (nr_matches > max_signs) { - idx += nr_matches - max_signs; - } - if (idx >= nr_matches) { return 0; } - return matches[idx]->typenr; + return matches[nr_matches - idx -1]->typenr; } return 0; |