From e4b407f536ba8bd007152649a347a95320d80fce Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 4 Jul 2019 11:59:28 +0200 Subject: patch 8.1.1623: display wrong with signs in narrow number column Problem: Display wrong with signs in narrow number column. Solution: Increase the numbercolumn width if needed. (Yegappan Lakshmanan, closes #4606) --- src/option.c | 8 +++++++- src/screen.c | 8 ++++++++ src/sign.c | 26 ++++++++++++++++++++++++ src/testdir/test_signs.vim | 50 ++++++++++++++++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 93 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/option.c b/src/option.c index cd50e8d622..4856a598d6 100644 --- a/src/option.c +++ b/src/option.c @@ -7454,11 +7454,17 @@ did_set_string_option( #endif /* FEAT_INS_EXPAND */ #ifdef FEAT_SIGNS - /* 'signcolumn' */ + // 'signcolumn' else if (varp == &curwin->w_p_scl) { if (check_opt_strings(*varp, p_scl_values, FALSE) != OK) errmsg = e_invarg; + // When changing the 'signcolumn' to or from 'number', recompute the + // width of the number column if 'number' or 'relativenumber' is set. + if (((*oldval == 'n' && *(oldval + 1) == 'u') + || (*curwin->w_p_scl == 'n' && *(curwin->w_p_scl + 1) =='u')) + && (curwin->w_p_nu || curwin->w_p_rnu)) + curwin->w_nrwidth_line_count = 0; } #endif diff --git a/src/screen.c b/src/screen.c index d39fca2637..b810065abf 100644 --- a/src/screen.c +++ b/src/screen.c @@ -11333,6 +11333,14 @@ number_width(win_T *wp) if (n < wp->w_p_nuw - 1) n = wp->w_p_nuw - 1; +# ifdef FEAT_SIGNS + // If 'signcolumn' is set to 'number' and there is a sign to display, then + // the minimal width for the number column is 2. + if (n < 2 && (wp->w_buffer->b_signlist != NULL) + && (*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u')) + n = 2; +# endif + wp->w_nrwidth_width = n; wp->w_nuw_cached = wp->w_p_nuw; return n; diff --git a/src/sign.c b/src/sign.c index 7ea40abf1f..a67f3ec8cf 100644 --- a/src/sign.c +++ b/src/sign.c @@ -1008,6 +1008,20 @@ sign_list_by_name(char_u *name) semsg(_("E155: Unknown sign: %s"), name); } + static void +may_force_numberwidth_recompute(buf_T *buf, int unplace) +{ + tabpage_T *tp; + win_T *wp; + + FOR_ALL_TAB_WINDOWS(tp, wp) + if (wp->w_buffer == buf + && (wp->w_p_nu || wp->w_p_rnu) + && (unplace || wp->w_nrwidth_width < 2) + && (*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u')) + wp->w_nrwidth_line_count = 0; +} + /* * Place a sign at the specified file location or update a sign. */ @@ -1045,7 +1059,13 @@ sign_place( // ":sign place {id} file={fname}": change sign type lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr); if (lnum > 0) + { redraw_buf_line_later(buf, lnum); + + // When displaying signs in the 'number' column, if the width of the + // number column is less than 2, then force recomputing the width. + may_force_numberwidth_recompute(buf, FALSE); + } else { semsg(_("E885: Not possible to change sign %s"), sign_name); @@ -1080,6 +1100,12 @@ sign_unplace(int sign_id, char_u *sign_group, buf_T *buf, linenr_T atlnum) return FAIL; } + // When all the signs in a buffer are removed, force recomputing the + // number column width (if enabled) in all the windows displaying the + // buffer if 'signcolumn' is set to 'number' in that window. + if (buf->b_signlist == NULL) + may_force_numberwidth_recompute(buf, TRUE); + return OK; } diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim index c979804a80..898acbc38e 100644 --- a/src/testdir/test_signs.vim +++ b/src/testdir/test_signs.vim @@ -1788,6 +1788,56 @@ func Test_sign_numcol() redraw! call assert_equal("=> 1 01234", s:ScreenLine(1, 1, 11)) + " Test displaying signs in the number column with width 1 + call sign_unplace('*') + call append(1, "abcde") + call append(2, "01234") + " Enable number column with width 1 + set number numberwidth=1 signcolumn=auto + redraw! + call assert_equal("3 01234", s:ScreenLine(3, 1, 7)) + " Place a sign and make sure number column width remains the same + sign place 20 line=2 name=sign1 + redraw! + call assert_equal("=>2 abcde", s:ScreenLine(2, 1, 9)) + call assert_equal(" 3 01234", s:ScreenLine(3, 1, 9)) + " Set 'signcolumn' to 'number', make sure the number column width increases + set signcolumn=number + redraw! + call assert_equal("=> abcde", s:ScreenLine(2, 1, 8)) + call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8)) + " Set 'signcolumn' to 'auto', make sure the number column width is 1. + set signcolumn=auto + redraw! + call assert_equal("=>2 abcde", s:ScreenLine(2, 1, 9)) + call assert_equal(" 3 01234", s:ScreenLine(3, 1, 9)) + " Set 'signcolumn' to 'number', make sure the number column width is 2. + set signcolumn=number + redraw! + call assert_equal("=> abcde", s:ScreenLine(2, 1, 8)) + call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8)) + " Disable 'number' column + set nonumber + redraw! + call assert_equal("=>abcde", s:ScreenLine(2, 1, 7)) + call assert_equal(" 01234", s:ScreenLine(3, 1, 7)) + " Enable 'number' column + set number + redraw! + call assert_equal("=> abcde", s:ScreenLine(2, 1, 8)) + call assert_equal(" 3 01234", s:ScreenLine(3, 1, 8)) + " Remove the sign and make sure the width of the number column is 1. + call sign_unplace('', {'id' : 20}) + redraw! + call assert_equal("3 01234", s:ScreenLine(3, 1, 7)) + " When the first sign is placed with 'signcolumn' set to number, verify that + " the number column width increases + sign place 30 line=1 name=sign1 + redraw! + call assert_equal("=> 01234", s:ScreenLine(1, 1, 8)) + call assert_equal(" 2 abcde", s:ScreenLine(2, 1, 8)) + + sign unplace * group=* sign undefine sign1 set signcolumn& set number& diff --git a/src/version.c b/src/version.c index efad64cad0..8e2399f430 100644 --- a/src/version.c +++ b/src/version.c @@ -777,6 +777,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1623, /**/ 1622, /**/ -- cgit v1.2.3