Patch 8.1.1564
Problem: Sign column takes up space. (Adam Stankiewicz)
Solution: Optionally put signs in the number column. (Yegappan Lakshmanan,
closes #4555, closes #4515)
Files: runtime/doc/options.txt, src/option.c, src/screen.c,
src/testdir/test_signs.vim
*** ../vim-8.1.1563/runtime/doc/options.txt 2019-05-26 19:20:33.024744457
+0200
--- runtime/doc/options.txt 2019-06-17 21:39:05.973354220 +0200
***************
*** 6803,6808 ****
--- 6803,6810 ----
"auto" only when there is a sign to display
"no" never
"yes" always
+ "number" display signs in the 'number' column. If the number
+ column is not present, then behaves like 'auto'.
*'smartcase'* *'scs'* *'nosmartcase'* *'noscs'*
*** ../vim-8.1.1563/src/option.c 2019-06-16 16:41:36.460010888 +0200
--- src/option.c 2019-06-17 21:40:51.489062014 +0200
***************
*** 3231,3237 ****
static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview",
"noinsert", "noselect", NULL};
#endif
#ifdef FEAT_SIGNS
! static char *(p_scl_values[]) = {"yes", "no", "auto", NULL};
#endif
#if defined(MSWIN) && defined(FEAT_TERMINAL)
static char *(p_twt_values[]) = {"winpty", "conpty", "", NULL};
--- 3231,3237 ----
static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview",
"noinsert", "noselect", NULL};
#endif
#ifdef FEAT_SIGNS
! static char *(p_scl_values[]) = {"yes", "no", "auto", "number", NULL};
#endif
#if defined(MSWIN) && defined(FEAT_TERMINAL)
static char *(p_twt_values[]) = {"winpty", "conpty", "", NULL};
***************
*** 13556,13561 ****
--- 13556,13567 ----
int
signcolumn_on(win_T *wp)
{
+ // If 'signcolumn' is set to 'number', signs are displayed in the 'number'
+ // column (if present). Otherwise signs are to be displayed in the sign
+ // column.
+ if (*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u')
+ return wp->w_buffer->b_signlist != NULL && !wp->w_p_nu && !wp->w_p_rnu;
+
if (*wp->w_p_scl == 'n')
return FALSE;
if (*wp->w_p_scl == 'y')
*** ../vim-8.1.1563/src/screen.c 2019-06-16 19:05:08.714676794 +0200
--- src/screen.c 2019-06-17 21:43:25.788589314 +0200
***************
*** 3037,3042 ****
--- 3037,3127 ----
}
#endif
+ #ifdef FEAT_SIGNS
+ /*
+ * Get information needed to display the sign in line 'lnum' in window 'wp'.
+ * If 'nrcol' is TRUE, the sign is going to be displayed in the number column.
+ * Otherwise the sign is going to be displayed in the sign column.
+ */
+ static void
+ get_sign_display_info(
+ int nrcol,
+ win_T *wp,
+ linenr_T lnum,
+ int wcr_attr,
+ int row,
+ int startrow,
+ int filler_lines,
+ int filler_todo,
+ int *c_extrap,
+ int *c_finalp,
+ char_u *extra,
+ char_u **pp_extra,
+ int *n_extrap,
+ int *char_attrp)
+ {
+ int text_sign;
+ # ifdef FEAT_SIGN_ICONS
+ int icon_sign;
+ # endif
+
+ // Draw two cells with the sign value or blank.
+ *c_extrap = ' ';
+ *c_finalp = NUL;
+ if (nrcol)
+ *n_extrap = number_width(wp) + 1;
+ else
+ {
+ *char_attrp = hl_combine_attr(wcr_attr, HL_ATTR(HLF_SC));
+ *n_extrap = 2;
+ }
+
+ if (row == startrow
+ #ifdef FEAT_DIFF
+ + filler_lines && filler_todo <= 0
+ #endif
+ )
+ {
+ text_sign = buf_getsigntype(wp->w_buffer, lnum, SIGN_TEXT);
+ # ifdef FEAT_SIGN_ICONS
+ icon_sign = buf_getsigntype(wp->w_buffer, lnum, SIGN_ICON);
+ if (gui.in_use && icon_sign != 0)
+ {
+ // Use the image in this position.
+ *c_extrap = SIGN_BYTE;
+ *c_finalp = NUL;
+ # ifdef FEAT_NETBEANS_INTG
+ if (buf_signcount(wp->w_buffer, lnum) > 1)
+ {
+ *c_extrap = MULTISIGN_BYTE;
+ *c_finalp = NUL;
+ }
+ # endif
+ *char_attrp = icon_sign;
+ }
+ else
+ # endif
+ if (text_sign != 0)
+ {
+ *pp_extra = sign_get_text(text_sign);
+ if (*pp_extra != NULL)
+ {
+ if (nrcol)
+ {
+ sprintf((char *)extra, "%-*s ", number_width(wp),
+ *pp_extra);
+ *pp_extra = extra;
+ }
+ *c_extrap = NUL;
+ *c_finalp = NUL;
+ *n_extrap = (int)STRLEN(*pp_extra);
+ }
+ *char_attrp = sign_get_attr(text_sign, FALSE);
+ }
+ }
+ }
+ #endif
+
/*
* Display line "lnum" of window 'wp' on the screen.
* Start at row "startrow", stop when "endrow" is reached.
***************
*** 3876,3933 ****
/* Show the sign column when there are any signs in this
* buffer or when using Netbeans. */
if (signcolumn_on(wp))
! {
! int text_sign;
! # ifdef FEAT_SIGN_ICONS
! int icon_sign;
! # endif
!
! /* Draw two cells with the sign value or blank. */
! c_extra = ' ';
! c_final = NUL;
! char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_SC));
! n_extra = 2;
!
! if (row == startrow
! #ifdef FEAT_DIFF
! + filler_lines && filler_todo <= 0
! #endif
! )
! {
! text_sign = buf_getsigntype(wp->w_buffer, lnum,
! SIGN_TEXT);
! # ifdef FEAT_SIGN_ICONS
! icon_sign = buf_getsigntype(wp->w_buffer, lnum,
! SIGN_ICON);
! if (gui.in_use && icon_sign != 0)
! {
! /* Use the image in this position. */
! c_extra = SIGN_BYTE;
! c_final = NUL;
! # ifdef FEAT_NETBEANS_INTG
! if (buf_signcount(wp->w_buffer, lnum) > 1)
! {
! c_extra = MULTISIGN_BYTE;
! c_final = NUL;
! }
! # endif
! char_attr = icon_sign;
! }
! else
! # endif
! if (text_sign != 0)
! {
! p_extra = sign_get_text(text_sign);
! if (p_extra != NULL)
! {
! c_extra = NUL;
! c_final = NUL;
! n_extra = (int)STRLEN(p_extra);
! }
! char_attr = sign_get_attr(text_sign, FALSE);
! }
! }
! }
}
#endif
--- 3961,3969 ----
/* Show the sign column when there are any signs in this
* buffer or when using Netbeans. */
if (signcolumn_on(wp))
! get_sign_display_info(FALSE, wp, lnum, wcr_attr, row,
! startrow, filler_lines, filler_todo, &c_extra,
! &c_final, extra, &p_extra, &n_extra, &char_attr);
}
#endif
***************
*** 3943,3955 ****
#endif
|| vim_strchr(p_cpo, CPO_NUMCOL) == NULL))
{
! /* Draw the line number (empty space after wrapping). */
! if (row == startrow
#ifdef FEAT_DIFF
+ filler_lines
#endif
)
! {
long num;
char *fmt = "%*ld ";
--- 3979,4005 ----
#endif
|| vim_strchr(p_cpo, CPO_NUMCOL) == NULL))
{
! #ifdef FEAT_SIGNS
! // If 'signcolumn' is set to 'number' and a sign is present
! // in 'lnum', then display the sign instead of the line
! // number.
! if ((*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u')
! && buf_findsign_id(wp->w_buffer, lnum,
! (char_u *)"*") != 0)
! get_sign_display_info(TRUE, wp, lnum, wcr_attr, row,
! startrow, filler_lines, filler_todo, &c_extra,
! &c_final, extra, &p_extra, &n_extra,
! &char_attr);
! else
! #endif
! {
! /* Draw the line number (empty space after wrapping). */
! if (row == startrow
#ifdef FEAT_DIFF
+ filler_lines
#endif
)
! {
long num;
char *fmt = "%*ld ";
***************
*** 3992,4014 ****
p_extra = extra;
c_extra = NUL;
c_final = NUL;
! }
! else
! {
c_extra = ' ';
c_final = NUL;
! }
! n_extra = number_width(wp) + 1;
! char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_N));
#ifdef FEAT_SYN_HL
! /* When 'cursorline' is set highlight the line number of
! * the current line differently.
! * TODO: Can we use CursorLine instead of CursorLineNr
! * when CursorLineNr isn't set? */
! if ((wp->w_p_cul || wp->w_p_rnu)
&& lnum == wp->w_cursor.lnum)
char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLN));
#endif
}
}
--- 4042,4065 ----
p_extra = extra;
c_extra = NUL;
c_final = NUL;
! }
! else
! {
c_extra = ' ';
c_final = NUL;
! }
! n_extra = number_width(wp) + 1;
! char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_N));
#ifdef FEAT_SYN_HL
! /* When 'cursorline' is set highlight the line number of
! * the current line differently.
! * TODO: Can we use CursorLine instead of CursorLineNr
! * when CursorLineNr isn't set? */
! if ((wp->w_p_cul || wp->w_p_rnu)
&& lnum == wp->w_cursor.lnum)
char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLN));
#endif
+ }
}
}
*** ../vim-8.1.1563/src/testdir/test_signs.vim 2019-06-16 13:55:13.888995469
+0200
--- src/testdir/test_signs.vim 2019-06-17 21:21:05.425126639 +0200
***************
*** 1736,1738 ****
--- 1736,1795 ----
call StopVimInTerminal(buf)
call delete('XtestSigncolumn')
endfunc
+
+ " Return the 'len' characters in screen starting from (row,col)
+ func s:ScreenLine(row, col, len)
+ let s = ''
+ for i in range(a:len)
+ let s .= nr2char(screenchar(a:row, a:col + i))
+ endfor
+ return s
+ endfunc
+
+ " Test for 'signcolumn' set to 'number'.
+ func Test_sign_numcol()
+ new
+ call append(0, "01234")
+ " With 'signcolumn' set to 'number', make sure sign is displayed in the
+ " number column and line number is not displayed.
+ set numberwidth=2
+ set number
+ set signcolumn=number
+ sign define sign1 text==>
+ sign place 10 line=1 name=sign1
+ redraw!
+ call assert_equal("=> 01234", s:ScreenLine(1, 1, 8))
+
+ " With 'signcolumn' set to 'number', when there is no sign, make sure line
+ " number is displayed in the number column
+ sign unplace 10
+ redraw!
+ call assert_equal("1 01234", s:ScreenLine(1, 1, 7))
+
+ " Disable number column. Check whether sign is displayed in the sign column
+ set numberwidth=4
+ set nonumber
+ sign place 10 line=1 name=sign1
+ redraw!
+ call assert_equal("=>01234", s:ScreenLine(1, 1, 7))
+
+ " Enable number column. Check whether sign is displayed in the number column
+ set number
+ redraw!
+ call assert_equal("=> 01234", s:ScreenLine(1, 1, 9))
+
+ " Disable sign column. Make sure line number is displayed
+ set signcolumn=no
+ redraw!
+ call assert_equal(" 1 01234", s:ScreenLine(1, 1, 9))
+
+ " Enable auto sign column. Make sure both sign and line number are displayed
+ set signcolumn=auto
+ redraw!
+ call assert_equal("=> 1 01234", s:ScreenLine(1, 1, 11))
+
+ sign undefine sign1
+ set signcolumn&
+ set number&
+ enew! | close
+ endfunc
*** ../vim-8.1.1563/src/version.c 2019-06-17 21:18:37.857807061 +0200
--- src/version.c 2019-06-17 21:22:20.688781138 +0200
***************
*** 779,780 ****
--- 779,782 ----
{ /* Add new patch number below this line */
+ /**/
+ 1564,
/**/
--
Don't be humble ... you're not that great.
-- Golda Meir
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201906171948.x5HJmjO5000796%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.