mirror of
https://github.com/neovim/neovim.git
synced 2024-12-31 17:13:26 -07:00
vim-patch:8.2.1705: "verbose hi Name" reports incorrect info after ":hi clear"
Problem: "verbose hi Name" reports incorrect info after ":hi clear". Solution: Store the script context. (Antony Scriven, closes vim/vim#6975)e8df010498
Also adds src/nvim/testdir/script_util.vim which originates from patch 8.2.1366 (a6296200bd
) because some tests in test_highlight.vim use it for testing :verbose. Should merge this and older related patches later. Also, fix collateral damage to test_options.vim test_options tests for file name completion in the test directory, but since we've added a new file, the test output is now different. This test is slightly different from upstream anyway, so for now we just add the file name. This may change when more upstream patches are added which alter this test.
This commit is contained in:
parent
8601e8b0d6
commit
7e89606591
@ -61,6 +61,7 @@ struct hl_group {
|
||||
int sg_link; ///< link to this highlight group ID
|
||||
int sg_deflink; ///< default link; restored in highlight_clear()
|
||||
int sg_set; ///< combination of flags in \ref SG_SET
|
||||
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
|
||||
// for terminal UIs
|
||||
int sg_cterm; ///< "cterm=" highlighting attr
|
||||
@ -6633,6 +6634,8 @@ void do_highlight(const char *line, const bool forceit, const bool init)
|
||||
hlgroup = &HL_TABLE()[from_id - 1];
|
||||
if (dodefault && (forceit || hlgroup->sg_deflink == 0)) {
|
||||
hlgroup->sg_deflink = to_id;
|
||||
hlgroup->sg_deflink_sctx = current_sctx;
|
||||
hlgroup->sg_deflink_sctx.sc_lnum += sourcing_lnum;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7114,14 +7117,11 @@ static void highlight_clear(int idx)
|
||||
XFREE_CLEAR(HL_TABLE()[idx].sg_rgb_bg_name);
|
||||
XFREE_CLEAR(HL_TABLE()[idx].sg_rgb_sp_name);
|
||||
HL_TABLE()[idx].sg_blend = -1;
|
||||
// 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;
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
|
69
src/nvim/testdir/script_util.vim
Normal file
69
src/nvim/testdir/script_util.vim
Normal file
@ -0,0 +1,69 @@
|
||||
" Functions shared by the tests for Vim Script
|
||||
|
||||
" Commands to track the execution path of a script
|
||||
com! XpathINIT let g:Xpath = ''
|
||||
com! -nargs=1 -bar Xpath let g:Xpath ..= <args>
|
||||
com! XloopINIT let g:Xloop = 1
|
||||
com! -nargs=1 -bar Xloop let g:Xpath ..= <args> .. g:Xloop
|
||||
com! XloopNEXT let g:Xloop += 1
|
||||
|
||||
" MakeScript() - Make a script file from a function. {{{2
|
||||
"
|
||||
" Create a script that consists of the body of the function a:funcname.
|
||||
" Replace any ":return" by a ":finish", any argument variable by a global
|
||||
" variable, and every ":call" by a ":source" for the next following argument
|
||||
" in the variable argument list. This function is useful if similar tests are
|
||||
" to be made for a ":return" from a function call or a ":finish" in a script
|
||||
" file.
|
||||
func MakeScript(funcname, ...)
|
||||
let script = tempname()
|
||||
execute "redir! >" . script
|
||||
execute "function" a:funcname
|
||||
redir END
|
||||
execute "edit" script
|
||||
" Delete the "function" and the "endfunction" lines. Do not include the
|
||||
" word "function" in the pattern since it might be translated if LANG is
|
||||
" set. When MakeScript() is being debugged, this deletes also the debugging
|
||||
" output of its line 3 and 4.
|
||||
exec '1,/.*' . a:funcname . '(.*)/d'
|
||||
/^\d*\s*endfunction\>/,$d
|
||||
%s/^\d*//e
|
||||
%s/return/finish/e
|
||||
%s/\<a:\(\h\w*\)/g:\1/ge
|
||||
normal gg0
|
||||
let cnt = 0
|
||||
while search('\<call\s*\%(\u\|s:\)\w*\s*(.*)', 'W') > 0
|
||||
let cnt = cnt + 1
|
||||
s/\<call\s*\%(\u\|s:\)\w*\s*(.*)/\='source ' . a:{cnt}/
|
||||
endwhile
|
||||
g/^\s*$/d
|
||||
write
|
||||
bwipeout
|
||||
return script
|
||||
endfunc
|
||||
|
||||
" ExecAsScript - Source a temporary script made from a function. {{{2
|
||||
"
|
||||
" Make a temporary script file from the function a:funcname, ":source" it, and
|
||||
" delete it afterwards. However, if an exception is thrown the file may remain,
|
||||
" the caller should call DeleteTheScript() afterwards.
|
||||
let s:script_name = ''
|
||||
function! ExecAsScript(funcname)
|
||||
" Make a script from the function passed as argument.
|
||||
let s:script_name = MakeScript(a:funcname)
|
||||
|
||||
" Source and delete the script.
|
||||
exec "source" s:script_name
|
||||
call delete(s:script_name)
|
||||
let s:script_name = ''
|
||||
endfunction
|
||||
|
||||
function! DeleteTheScript()
|
||||
if s:script_name
|
||||
call delete(s:script_name)
|
||||
let s:script_name = ''
|
||||
endif
|
||||
endfunc
|
||||
|
||||
com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
|
||||
|
@ -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
|
||||
@ -661,6 +662,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
|
||||
|
@ -225,7 +225,7 @@ func Test_set_completion()
|
||||
|
||||
" Expand files and directories.
|
||||
call feedkeys(":set tags=./\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_match('./samples/ ./sautest/ ./screendump.vim ./setup.vim ./shared.vim', @:)
|
||||
call assert_match('./samples/ ./sautest/ ./screendump.vim ./script_util.vim ./setup.vim ./shared.vim', @:)
|
||||
|
||||
call feedkeys(":set tags=./\\\\ dif\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:)
|
||||
|
Loading…
Reference in New Issue
Block a user