Skip to content

Commit

Permalink
Merge pull request neovim#16541 from jamessan/vim-8.2.3664
Browse files Browse the repository at this point in the history
vim-patch:8.2.3664,8.2.3743,8.2.3747,8.2.3748,8.2.3757
  • Loading branch information
jamessan authored and zeertzjq committed Dec 10, 2021
2 parents 238da85 + f3fb77c commit 781a7f6
Show file tree
Hide file tree
Showing 15 changed files with 440 additions and 31 deletions.
15 changes: 14 additions & 1 deletion runtime/doc/sign.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ The color of the column is set with the SignColumn highlight group
:highlight SignColumn guibg=darkgrey
<
If 'cursorline' is enabled, then the CursorLineSign highlight group is used
|hl-CursorLineSign|.
*sign-identifier*
Each placed sign is identified by a number called the sign identifier. This
identifier is used to jump to the sign or to remove the sign. The identifier
Expand Down Expand Up @@ -131,6 +133,10 @@ See |sign_define()| for the equivalent Vim script function.
texthl={group}
Highlighting group used for the text item.

culhl={group}
Highlighting group used for the text item when the cursor is
on the same line as the sign and 'cursorline' is enabled.

Example: >
:sign define MySign text=>> texthl=Search linehl=DiffText
<
Expand Down Expand Up @@ -377,6 +383,9 @@ sign_define({list})
text text that is displayed when there is no icon
or the GUI is not being used.
texthl highlight group used for the text item
culhl highlight group used for the text item when
the cursor is on the same line as the sign and
'cursorline' is enabled.
numhl highlight group used for 'number' column at the
associated line. Overrides |hl-LineNr|,
|hl-CursorLineNr|.
Expand Down Expand Up @@ -425,9 +434,13 @@ sign_getdefined([{name}]) *sign_getdefined()*
or the GUI is not being used.
texthl highlight group used for the text item; not
present if not set.
culhl highlight group used for the text item when
the cursor is on the same line as the sign and
'cursorline' is enabled; not present if not
set.
numhl highlight group used for 'number' column at the
associated line. Overrides |hl-LineNr|,
|hl-CursorLineNr|.
|hl-CursorLineNr|; not present if not set.

Returns an empty List if there are no signs and when {name} is
not found.
Expand Down
4 changes: 4 additions & 0 deletions runtime/doc/syntax.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5127,6 +5127,10 @@ LineNrBelow Line number for when the 'relativenumber'
*hl-CursorLineNr*
CursorLineNr Like LineNr when 'cursorline' is set and 'cursorlineopt'
contains "number" or is "both", for the cursor line.
*hl-CursorLineSign*
CursorLineSign Like SignColumn when 'cursorline' is set for the cursor line.
*hl-CursorLineFold*
CursorLineFold Like FoldColumn when 'cursorline' is set for the cursor line.
*hl-MatchParen*
MatchParen The character under the cursor or just before it, if it
is a paired bracket, and its match. |pi_paren.txt|
Expand Down
2 changes: 2 additions & 0 deletions src/nvim/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,8 @@ EXTERN char e_non_empty_string_required[] INIT(= N_("E1142: Non-empty string req

EXTERN char e_cannot_define_autocommands_for_all_events[] INIT(= N_("E1155: Cannot define autocommands for ALL events"));

EXTERN char e_highlight_group_name_too_long[] INIT(= N_("E1249: Highlight group name too long"));

EXTERN char top_bot_msg[] INIT(= N_("search hit TOP, continuing at BOTTOM"));
EXTERN char bot_top_msg[] INIT(= N_("search hit BOTTOM, continuing at TOP"));

Expand Down
4 changes: 4 additions & 0 deletions src/nvim/highlight_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ typedef enum {
HLF_LNA, // LineNrAbove
HLF_LNB, // LineNrBelow
HLF_CLN, // current line number when 'cursorline' is set
HLF_CLS, // current line sign column
HLF_CLF, // current line fold
HLF_R, // return to continue message and yes/no questions
HLF_S, // status lines
HLF_SNC, // status lines of not-current windows
Expand Down Expand Up @@ -122,6 +124,8 @@ EXTERN const char *hlf_names[] INIT(= {
[HLF_LNA] = "LineNrAbove",
[HLF_LNB] = "LineNrBelow",
[HLF_CLN] = "CursorLineNr",
[HLF_CLS] = "CursorLineSign",
[HLF_CLF] = "CursorLineFold",
[HLF_R] = "Question",
[HLF_S] = "StatusLine",
[HLF_SNC] = "StatusLineNC",
Expand Down
1 change: 1 addition & 0 deletions src/nvim/option.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ typedef struct vimoption {
#define HIGHLIGHT_INIT \
"8:SpecialKey,~:EndOfBuffer,z:TermCursor,Z:TermCursorNC,@:NonText,d:Directory,e:ErrorMsg," \
"i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,a:LineNrAbove,b:LineNrBelow,N:CursorLineNr," \
"G:CursorLineSign,O:CursorLineFold" \
"r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg," \
"W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn," \
"-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar," \
Expand Down
41 changes: 31 additions & 10 deletions src/nvim/screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -2746,7 +2746,11 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
p_extra = p_extra_free;
c_extra = NUL;
c_final = NUL;
char_attr = win_hl_attr(wp, HLF_FC);
if (use_cursor_line_sign(wp, lnum)) {
char_attr = win_hl_attr(wp, HLF_CLF);
} else {
char_attr = win_hl_attr(wp, HLF_FC);
}
}
}

Expand All @@ -2757,7 +2761,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
* buffer or when using Netbeans. */
int count = win_signcol_count(wp);
if (count > 0) {
get_sign_display_info(false, wp, sattrs, row,
get_sign_display_info(false, wp, lnum, sattrs, row,
startrow, filler_lines, filler_todo, count,
&c_extra, &c_final, extra, sizeof(extra),
&p_extra, &n_extra,
Expand All @@ -2778,7 +2782,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
if (*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u'
&& num_signs > 0) {
int count = win_signcol_count(wp);
get_sign_display_info(true, wp, sattrs, row,
get_sign_display_info(true, wp, lnum, sattrs, row,
startrow, filler_lines, filler_todo, count,
&c_extra, &c_final, extra, sizeof(extra),
&p_extra, &n_extra,
Expand Down Expand Up @@ -4617,26 +4621,38 @@ void screen_adjust_grid(ScreenGrid **grid, int *row_off, int *col_off)
}
}

// Return true if CursorLineSign highlight is to be used.
static bool use_cursor_line_sign(win_T *wp, linenr_T lnum)
{
return wp->w_p_cul
&& lnum == wp->w_cursor.lnum
&& (wp->w_p_culopt_flags & CULOPT_NBR);
}

// 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.
//
// @param count max number of signs
// @param[out] n_extrap number of characters from pp_extra to display
// @param[in, out] sign_idxp Index of the displayed sign
static void get_sign_display_info(bool nrcol, win_T *wp, sign_attrs_T sattrs[], int row,
int startrow, int filler_lines, int filler_todo, int count,
int *c_extrap, int *c_finalp, char_u *extra, size_t extra_size,
char_u **pp_extra, int *n_extrap, int *char_attrp,
int *draw_statep, int *sign_idxp)
static void get_sign_display_info(bool nrcol, win_T *wp, linenr_T lnum, sign_attrs_T sattrs[],
int row, int startrow, int filler_lines, int filler_todo,
int count, int *c_extrap, int *c_finalp, char_u *extra,
size_t extra_size, char_u **pp_extra, int *n_extrap,
int *char_attrp, int *draw_statep, int *sign_idxp)
{
// Draw cells with the sign value or blank.
*c_extrap = ' ';
*c_finalp = NUL;
if (nrcol) {
*n_extrap = number_width(wp) + 1;
} else {
*char_attrp = win_hl_attr(wp, HLF_SC);
if (use_cursor_line_sign(wp, lnum)) {
*char_attrp = win_hl_attr(wp, HLF_CLS);
} else {
*char_attrp = win_hl_attr(wp, HLF_SC);
}
*n_extrap = win_signcol_width(wp);
}

Expand Down Expand Up @@ -4676,7 +4692,12 @@ static void get_sign_display_info(bool nrcol, win_T *wp, sign_attrs_T sattrs[],
(*pp_extra)[*n_extrap] = NUL;
}
}
*char_attrp = sattr->sat_texthl;

if (use_cursor_line_sign(wp, lnum) && sattr->sat_culhl > 0) {
*char_attrp = sattr->sat_culhl;
} else {
*char_attrp = sattr->sat_texthl;
}
}
}

Expand Down
61 changes: 55 additions & 6 deletions src/nvim/sign.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct sign {
char_u *sn_text; // text used instead of pixmap
int sn_line_hl; // highlight ID for line
int sn_text_hl; // highlight ID for text
int sn_cul_hl; // highlight ID for text on current line when 'cursorline' is set
int sn_num_hl; // highlight ID for line number
};

Expand Down Expand Up @@ -499,6 +500,9 @@ int buf_get_signattrs(buf_T *buf, linenr_T lnum, sign_attrs_T sattrs[])
if (sp->sn_line_hl != 0) {
sattr.sat_linehl = syn_id2attr(sp->sn_line_hl);
}
if (sp->sn_cul_hl != 0) {
sattr.sat_culhl = syn_id2attr(sp->sn_cul_hl);
}
if (sp->sn_num_hl != 0) {
sattr.sat_numhl = syn_id2attr(sp->sn_num_hl);
}
Expand Down Expand Up @@ -901,7 +905,7 @@ static int sign_define_init_text(sign_T *sp, char_u *text)

/// Define a new sign or update an existing sign
int sign_define_by_name(char_u *name, char_u *icon, char_u *linehl, char_u *text, char_u *texthl,
char *numhl)
char_u *culhl, char *numhl)
{
sign_T *sp_prev;
sign_T *sp;
Expand Down Expand Up @@ -939,15 +943,35 @@ int sign_define_by_name(char_u *name, char_u *icon, char_u *linehl, char_u *text
}

if (linehl != NULL) {
sp->sn_line_hl = syn_check_group((char *)linehl, (int)STRLEN(linehl));
if (*linehl == NUL) {
sp->sn_line_hl = 0;
} else {
sp->sn_line_hl = syn_check_group((char *)linehl, (int)STRLEN(linehl));
}
}

if (texthl != NULL) {
sp->sn_text_hl = syn_check_group((char *)texthl, (int)STRLEN(texthl));
if (*texthl == NUL) {
sp->sn_text_hl = 0;
} else {
sp->sn_text_hl = syn_check_group((char *)texthl, (int)STRLEN(texthl));
}
}

if (culhl != NULL) {
if (*culhl == NUL) {
sp->sn_cul_hl = 0;
} else {
sp->sn_cul_hl = syn_check_group((char *)culhl, (int)STRLEN(culhl));
}
}

if (numhl != NULL) {
sp->sn_num_hl = syn_check_group(numhl, (int)STRLEN(numhl));
if (*numhl == NUL) {
sp->sn_num_hl = 0;
} else {
sp->sn_num_hl = syn_check_group(numhl, (int)STRLEN(numhl));
}
}

return OK;
Expand Down Expand Up @@ -1133,6 +1157,7 @@ static void sign_define_cmd(char_u *sign_name, char_u *cmdline)
char_u *text = NULL;
char_u *linehl = NULL;
char_u *texthl = NULL;
char_u *culhl = NULL;
char_u *numhl = NULL;
int failed = false;

Expand All @@ -1155,6 +1180,9 @@ static void sign_define_cmd(char_u *sign_name, char_u *cmdline)
} else if (STRNCMP(arg, "texthl=", 7) == 0) {
arg += 7;
texthl = vim_strnsave(arg, (size_t)(p - arg));
} else if (STRNCMP(arg, "culhl=", 6) == 0) {
arg += 6;
culhl = vim_strnsave(arg, (size_t)(p - arg));
} else if (STRNCMP(arg, "numhl=", 6) == 0) {
arg += 6;
numhl = vim_strnsave(arg, (size_t)(p - arg));
Expand All @@ -1166,13 +1194,14 @@ static void sign_define_cmd(char_u *sign_name, char_u *cmdline)
}

if (!failed) {
sign_define_by_name(sign_name, icon, linehl, text, texthl, (char *)numhl);
sign_define_by_name(sign_name, icon, linehl, text, texthl, culhl, (char *)numhl);
}

xfree(icon);
xfree(text);
xfree(linehl);
xfree(texthl);
xfree(culhl);
xfree(numhl);
}

Expand Down Expand Up @@ -1481,6 +1510,13 @@ static void sign_getinfo(sign_T *sp, dict_T *retdict)
}
tv_dict_add_str(retdict, S_LEN("texthl"), (char *)p);
}
if (sp->sn_cul_hl > 0) {
p = get_highlight_name_ext(NULL, sp->sn_cul_hl - 1, false);
if (p == NULL) {
p = "NONE";
}
tv_dict_add_str(retdict, S_LEN("culhl"), (char *)p);
}
if (sp->sn_num_hl > 0) {
p = get_highlight_name_ext(NULL, sp->sn_num_hl - 1, false);
if (p == NULL) {
Expand Down Expand Up @@ -1609,6 +1645,16 @@ static void sign_list_defined(sign_T *sp)
msg_puts(p);
}
}
if (sp->sn_cul_hl > 0) {
msg_puts(" culhl=");
const char *const p = get_highlight_name_ext(NULL,
sp->sn_cul_hl - 1, false);
if (p == NULL) {
msg_puts("NONE");
} else {
msg_puts(p);
}
}
if (sp->sn_num_hl > 0) {
msg_puts(" numhl=");
const char *const p = get_highlight_name_ext(NULL,
Expand Down Expand Up @@ -1847,6 +1893,7 @@ int sign_define_from_dict(const char *name_arg, dict_T *dict)
char *linehl = NULL;
char *text = NULL;
char *texthl = NULL;
char *culhl = NULL;
char *numhl = NULL;
int retval = -1;

Expand All @@ -1866,11 +1913,12 @@ int sign_define_from_dict(const char *name_arg, dict_T *dict)
linehl = tv_dict_get_string(dict, "linehl", true);
text = tv_dict_get_string(dict, "text", true);
texthl = tv_dict_get_string(dict, "texthl", true);
culhl = tv_dict_get_string(dict, "culhl", true);
numhl = tv_dict_get_string(dict, "numhl", true);
}

if (sign_define_by_name((char_u *)name, (char_u *)icon, (char_u *)linehl,
(char_u *)text, (char_u *)texthl, numhl)
(char_u *)text, (char_u *)texthl, (char_u *)culhl, numhl)
== OK) {
retval = 0;
}
Expand All @@ -1881,6 +1929,7 @@ int sign_define_from_dict(const char *name_arg, dict_T *dict)
xfree(linehl);
xfree(text);
xfree(texthl);
xfree(culhl);
xfree(numhl);

return retval;
Expand Down
1 change: 1 addition & 0 deletions src/nvim/sign_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ typedef struct sign_attrs_S {
char_u *sat_text;
int sat_texthl;
int sat_linehl;
int sat_culhl;
int sat_numhl;
} sign_attrs_T;

Expand Down
13 changes: 10 additions & 3 deletions src/nvim/syntax.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ static int include_none = 0; // when 1 include "nvim/None"
static int include_default = 0; // when 1 include "nvim/default"
static int include_link = 0; // when 2 include "nvim/link" and "clear"

#define MAX_SYN_NAME 200

/// The "term", "cterm" and "gui" arguments can be any combination of the
/// following names, separated by commas (but no spaces!).
static char *(hl_name_table[]) =
Expand Down Expand Up @@ -6175,6 +6177,8 @@ static const char *highlight_init_both[] = {
"default link LineNrAbove LineNr",
"default link LineNrBelow LineNr",
"default link QuickFixLine Search",
"default link CursorLineSign SignColumn",
"default link CursorLineFold FoldColumn",
"default link Substitute Search",
"default link Whitespace NonText",
"default link MsgSeparator StatusLine",
Expand Down Expand Up @@ -7623,10 +7627,9 @@ int syn_name2id(const char *name)
int syn_name2id_len(const char_u *name, size_t len)
FUNC_ATTR_NONNULL_ALL
{
char name_u[201];
char name_u[MAX_SYN_NAME + 1];

if (len == 0 || len > 200) {
// ID names over 200 chars don't deserve to be found!
if (len == 0 || len > MAX_SYN_NAME) {
return 0;
}

Expand Down Expand Up @@ -7684,6 +7687,10 @@ char_u *syn_id2name(int id)
/// @return 0 for failure else the id of the group
int syn_check_group(const char *name, int len)
{
if (len > MAX_SYN_NAME) {
emsg(_(e_highlight_group_name_too_long));
return 0;
}
int id = syn_name2id_len((char_u *)name, len);
if (id == 0) { // doesn't exist yet
return syn_add_group(vim_strnsave((char_u *)name, len));
Expand Down

0 comments on commit 781a7f6

Please sign in to comment.