diff options
author | Dan Aloni <alonid@gmail.com> | 2020-05-15 19:22:44 +0300 |
---|---|---|
committer | Dan Aloni <alonid@gmail.com> | 2021-04-17 10:11:17 +0300 |
commit | f2ed7605da45eb79a4f7bb89fb19f680fb5a4927 (patch) | |
tree | 20327ffc02b6c7a89cf84da36af50a479d03d2f4 /src/nvim/sign.c | |
parent | a6504ec3398af114585db1d1134335d838bdb8d9 (diff) | |
download | rneovim-f2ed7605da45eb79a4f7bb89fb19f680fb5a4927.tar.gz rneovim-f2ed7605da45eb79a4f7bb89fb19f680fb5a4927.tar.bz2 rneovim-f2ed7605da45eb79a4f7bb89fb19f680fb5a4927.zip |
Handle 'orphaned signs' on line deletion for signcolumn >= 2
Diffstat (limited to 'src/nvim/sign.c')
-rw-r--r-- | src/nvim/sign.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/nvim/sign.c b/src/nvim/sign.c index c7dc1a5b22..5c7b497a19 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -18,6 +18,7 @@ #include "nvim/move.h" #include "nvim/screen.h" #include "nvim/syntax.h" +#include "nvim/option.h" /// Struct to hold the sign properties. typedef struct sign sign_T; @@ -726,15 +727,29 @@ void sign_mark_adjust( long amount_after ) { - sign_entry_T *sign; // a sign in a b_signlist - linenr_T new_lnum; // new line number to assign to sign + sign_entry_T *sign; // a sign in a b_signlist + sign_entry_T *next; // the next sign in a b_signlist + sign_entry_T *last = NULL; // pointer to pointer to current sign + sign_entry_T **lastp = NULL; // pointer to pointer to current sign + linenr_T new_lnum; // new line number to assign to sign + int is_fixed = 0; + int signcol = win_signcol_configured(curwin, &is_fixed); curbuf->b_signcols_max = -1; + lastp = &curbuf->b_signlist; - FOR_ALL_SIGNS_IN_BUF(curbuf, sign) { + for (sign = curbuf->b_signlist; sign != NULL; sign = next) { + next = sign->se_next; new_lnum = sign->se_lnum; if (sign->se_lnum >= line1 && sign->se_lnum <= line2) { - if (amount != MAXLNUM) { + if (amount == MAXLNUM && (!is_fixed || signcol >= 2)) { + *lastp = next; + if (next) { + next->se_prev = last; + } + xfree(sign); + continue; + } else { new_lnum += amount; } } else if (sign->se_lnum > line2) { @@ -746,6 +761,9 @@ void sign_mark_adjust( if (sign->se_lnum >= line1 && new_lnum <= curbuf->b_ml.ml_line_count) { sign->se_lnum = new_lnum; } + + last = sign; + lastp = &sign->se_next; } } |