forked from aniani/vim
patch 8.2.1703: ":highlight clear" does not restore default link
Problem: ":highlight clear" does not restore default link. Solution: Remember the default link and restore it. (Antony Scriven, closes #6970, closes #4405)
This commit is contained in:
@@ -73,6 +73,7 @@ typedef struct
|
||||
char_u *sg_gui_sp_name;// GUI special color name
|
||||
#endif
|
||||
int sg_link; // link to this highlight group ID
|
||||
int sg_deflink; // default link; restored in highlight_clear()
|
||||
int sg_set; // combination of SG_* flags
|
||||
#ifdef FEAT_EVAL
|
||||
sctx_T sg_script_ctx; // script in which the group was last set
|
||||
@@ -715,6 +716,7 @@ do_highlight(
|
||||
char_u *to_end;
|
||||
int from_id;
|
||||
int to_id;
|
||||
hl_group_T *hlgroup = NULL;
|
||||
|
||||
from_end = skiptowhite(from_start);
|
||||
to_start = skipwhite(from_end);
|
||||
@@ -740,7 +742,14 @@ do_highlight(
|
||||
else
|
||||
to_id = syn_check_group(to_start, (int)(to_end - to_start));
|
||||
|
||||
if (from_id > 0 && (!init || HL_TABLE()[from_id - 1].sg_set == 0))
|
||||
if (from_id > 0)
|
||||
{
|
||||
hlgroup = &HL_TABLE()[from_id - 1];
|
||||
if (dodefault && (forceit || hlgroup->sg_deflink == 0))
|
||||
hlgroup->sg_deflink = to_id;
|
||||
}
|
||||
|
||||
if (from_id > 0 && (!init || hlgroup->sg_set == 0))
|
||||
{
|
||||
/*
|
||||
* Don't allow a link when there already is some highlighting
|
||||
@@ -752,21 +761,20 @@ do_highlight(
|
||||
if (SOURCING_NAME == NULL && !dodefault)
|
||||
emsg(_("E414: group has settings, highlight link ignored"));
|
||||
}
|
||||
else if (HL_TABLE()[from_id - 1].sg_link != to_id
|
||||
else if (hlgroup->sg_link != to_id
|
||||
#ifdef FEAT_EVAL
|
||||
|| HL_TABLE()[from_id - 1].sg_script_ctx.sc_sid
|
||||
!= current_sctx.sc_sid
|
||||
|| hlgroup->sg_script_ctx.sc_sid != current_sctx.sc_sid
|
||||
#endif
|
||||
|| HL_TABLE()[from_id - 1].sg_cleared)
|
||||
|| hlgroup->sg_cleared)
|
||||
{
|
||||
if (!init)
|
||||
HL_TABLE()[from_id - 1].sg_set |= SG_LINK;
|
||||
HL_TABLE()[from_id - 1].sg_link = to_id;
|
||||
hlgroup->sg_set |= SG_LINK;
|
||||
hlgroup->sg_link = to_id;
|
||||
#ifdef FEAT_EVAL
|
||||
HL_TABLE()[from_id - 1].sg_script_ctx = current_sctx;
|
||||
HL_TABLE()[from_id - 1].sg_script_ctx.sc_lnum += SOURCING_LNUM;
|
||||
hlgroup->sg_script_ctx = current_sctx;
|
||||
hlgroup->sg_script_ctx.sc_lnum += SOURCING_LNUM;
|
||||
#endif
|
||||
HL_TABLE()[from_id - 1].sg_cleared = FALSE;
|
||||
hlgroup->sg_cleared = FALSE;
|
||||
redraw_all_later(SOME_VALID);
|
||||
|
||||
// Only call highlight_changed() once after multiple changes.
|
||||
@@ -1684,6 +1692,8 @@ highlight_clear(int idx)
|
||||
HL_TABLE()[idx].sg_gui_attr = 0;
|
||||
#endif
|
||||
#ifdef FEAT_EVAL
|
||||
// Restore any default link.
|
||||
HL_TABLE()[idx].sg_link = HL_TABLE()[idx].sg_deflink;
|
||||
// Clear the script ID only when there is no link, since that is not
|
||||
// cleared.
|
||||
if (HL_TABLE()[idx].sg_link == 0)
|
||||
|
Reference in New Issue
Block a user