mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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)
This commit is contained in:
parent
e296e3177b
commit
e4b407f536
@ -7454,11 +7454,17 @@ did_set_string_option(
|
|||||||
#endif /* FEAT_INS_EXPAND */
|
#endif /* FEAT_INS_EXPAND */
|
||||||
|
|
||||||
#ifdef FEAT_SIGNS
|
#ifdef FEAT_SIGNS
|
||||||
/* 'signcolumn' */
|
// 'signcolumn'
|
||||||
else if (varp == &curwin->w_p_scl)
|
else if (varp == &curwin->w_p_scl)
|
||||||
{
|
{
|
||||||
if (check_opt_strings(*varp, p_scl_values, FALSE) != OK)
|
if (check_opt_strings(*varp, p_scl_values, FALSE) != OK)
|
||||||
errmsg = e_invarg;
|
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
|
#endif
|
||||||
|
|
||||||
|
@ -11333,6 +11333,14 @@ number_width(win_T *wp)
|
|||||||
if (n < wp->w_p_nuw - 1)
|
if (n < wp->w_p_nuw - 1)
|
||||||
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_nrwidth_width = n;
|
||||||
wp->w_nuw_cached = wp->w_p_nuw;
|
wp->w_nuw_cached = wp->w_p_nuw;
|
||||||
return n;
|
return n;
|
||||||
|
26
src/sign.c
26
src/sign.c
@ -1008,6 +1008,20 @@ sign_list_by_name(char_u *name)
|
|||||||
semsg(_("E155: Unknown sign: %s"), 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.
|
* 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
|
// ":sign place {id} file={fname}": change sign type
|
||||||
lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr);
|
lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr);
|
||||||
if (lnum > 0)
|
if (lnum > 0)
|
||||||
|
{
|
||||||
redraw_buf_line_later(buf, lnum);
|
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
|
else
|
||||||
{
|
{
|
||||||
semsg(_("E885: Not possible to change sign %s"), sign_name);
|
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;
|
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;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1788,6 +1788,56 @@ func Test_sign_numcol()
|
|||||||
redraw!
|
redraw!
|
||||||
call assert_equal("=> 1 01234", s:ScreenLine(1, 1, 11))
|
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
|
sign undefine sign1
|
||||||
set signcolumn&
|
set signcolumn&
|
||||||
set number&
|
set number&
|
||||||
|
@ -777,6 +777,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1623,
|
||||||
/**/
|
/**/
|
||||||
1622,
|
1622,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user