summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-18 19:40:45 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-18 19:40:45 +0200
commite8df0104985af58ee501a6fbac8ac9f886e84e5a (patch)
tree9502868deb49b4aab66db76fdb5008e6cc218b5f /src
parent77e5dcc36a82da040072d74e3ced410d15c42757 (diff)
downloadvim-git-e8df0104985af58ee501a6fbac8ac9f886e84e5a.tar.gz
patch 8.2.1705: "verbose hi Name" reports incorrect info after ":hi clear"v8.2.1705
Problem: "verbose hi Name" reports incorrect info after ":hi clear". Solution: Store the script context. (Antony Scriven, closes #6975)
Diffstat (limited to 'src')
-rw-r--r--src/highlight.c21
-rw-r--r--src/testdir/test_highlight.vim34
-rw-r--r--src/version.c2
3 files changed, 48 insertions, 9 deletions
diff --git a/src/highlight.c b/src/highlight.c
index 85745024c..0a014473b 100644
--- a/src/highlight.c
+++ b/src/highlight.c
@@ -76,6 +76,7 @@ typedef struct
int sg_deflink; // default link; restored in highlight_clear()
int sg_set; // combination of SG_* flags
#ifdef FEAT_EVAL
+ sctx_T sg_deflink_sctx; // script where the default link was set
sctx_T sg_script_ctx; // script in which the group was last set
#endif
} hl_group_T;
@@ -746,7 +747,13 @@ do_highlight(
{
hlgroup = &HL_TABLE()[from_id - 1];
if (dodefault && (forceit || hlgroup->sg_deflink == 0))
+ {
hlgroup->sg_deflink = to_id;
+#ifdef FEAT_EVAL
+ hlgroup->sg_deflink_sctx = current_sctx;
+ hlgroup->sg_deflink_sctx.sc_lnum += SOURCING_LNUM;
+#endif
+ }
}
if (from_id > 0 && (!init || hlgroup->sg_set == 0))
@@ -1691,16 +1698,12 @@ highlight_clear(int idx)
VIM_CLEAR(HL_TABLE()[idx].sg_font_name);
HL_TABLE()[idx].sg_gui_attr = 0;
#endif
-#ifdef FEAT_EVAL
- // Restore any default link.
+ // Restore default link and context if they exist. Otherwise clears.
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)
- {
- HL_TABLE()[idx].sg_script_ctx.sc_sid = 0;
- HL_TABLE()[idx].sg_script_ctx.sc_lnum = 0;
- }
+#ifdef FEAT_EVAL
+ // Since we set the default link, set the location to where the default
+ // link was set.
+ HL_TABLE()[idx].sg_script_ctx = HL_TABLE()[idx].sg_deflink_sctx;
#endif
}
diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim
index 5ad0c9414..a1c80cde6 100644
--- a/src/testdir/test_highlight.vim
+++ b/src/testdir/test_highlight.vim
@@ -3,6 +3,7 @@
source view_util.vim
source screendump.vim
source check.vim
+source script_util.vim
func Test_highlight()
" basic test if ":highlight" doesn't crash
@@ -870,6 +871,39 @@ func Test_highlight_clear_restores_links()
call assert_equal(HighlightArgs('aaa'), hl_aaa_ddd)
endfunc
+func Test_highlight_clear_restores_context()
+ func FuncContextDefault()
+ hi def link Context ContextDefault
+ endfun
+
+ func FuncContextRelink()
+ " Dummy line
+ hi link Context ContextRelink
+ endfunc
+
+ let scriptContextDefault = MakeScript("FuncContextDefault")
+ let scriptContextRelink = MakeScript("FuncContextRelink")
+ let patContextDefault = fnamemodify(scriptContextDefault, ':t') .. ' line 1'
+ let patContextRelink = fnamemodify(scriptContextRelink, ':t') .. ' line 2'
+
+ exec "source" scriptContextDefault
+ let hlContextDefault = execute("verbose hi Context")
+ call assert_match(patContextDefault, hlContextDefault)
+
+ exec "source" scriptContextRelink
+ let hlContextRelink = execute("verbose hi Context")
+ call assert_match(patContextRelink, hlContextRelink)
+
+ hi clear
+ let hlContextAfterClear = execute("verbose hi Context")
+ call assert_match(patContextDefault, hlContextAfterClear)
+
+ delfunc FuncContextDefault
+ delfunc FuncContextRelink
+ call delete(scriptContextDefault)
+ call delete(scriptContextRelink)
+endfunc
+
func Test_highlight_default_colorscheme_restores_links()
hi link TestLink Identifier
hi TestHi ctermbg=red
diff --git a/src/version.c b/src/version.c
index 0e52351ea..e47f0d19a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1705,
+/**/
1704,
/**/
1703,