summaryrefslogtreecommitdiff
path: root/src/sign.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-17 17:36:45 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-17 17:36:45 +0100
commitc771bf901622064dc27421b04853e16b6914a295 (patch)
tree508cf2c241e5581569d7e2b5b58c9fbf22e46432 /src/sign.c
parent88c86eb751de9e7e410b405084d35b32fafc2a24 (diff)
downloadvim-git-c771bf901622064dc27421b04853e16b6914a295.tar.gz
patch 8.1.0767: when deleting lines at the bottom signs are misplacedv8.1.0767
Problem: When deleting lines at the bottom signs are misplaced. Solution: Properly update the line number of signs at the end of a buffer after a delete/undo operation. (Yegappan Lakshmanan, closes #3798)
Diffstat (limited to 'src/sign.c')
-rw-r--r--src/sign.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/sign.c b/src/sign.c
index 6f7ead963..75f41235e 100644
--- a/src/sign.c
+++ b/src/sign.c
@@ -660,18 +660,28 @@ sign_mark_adjust(
long amount_after)
{
signlist_T *sign; // a sign in a b_signlist
+ linenr_T new_lnum;
FOR_ALL_SIGNS_IN_BUF(curbuf, sign)
{
+ // Ignore changes to lines after the sign
+ if (sign->lnum < line1)
+ continue;
+ new_lnum = sign->lnum;
if (sign->lnum >= line1 && sign->lnum <= line2)
{
- if (amount == MAXLNUM)
- sign->lnum = line1;
- else
- sign->lnum += amount;
+ if (amount != MAXLNUM)
+ new_lnum += amount;
}
else if (sign->lnum > line2)
- sign->lnum += amount_after;
+ // Lines inserted or deleted before the sign
+ new_lnum += amount_after;
+
+ // If the new sign line number is past the last line in the buffer,
+ // then don't adjust the line number. Otherwise, it will always be past
+ // the last line and will not be visible.
+ if (new_lnum <= curbuf->b_ml.ml_line_count)
+ sign->lnum = new_lnum;
}
}