# HG changeset patch # User Bram Moolenaar # Date 1678473905 -3600 # Node ID 50e447c67247b56d808bde2e20bda94a5f91ba17 # Parent 8784e64ab28592686e9268b91912e4084e1e2f91 patch 9.0.1399: highlight test script has a few problems Commit: https://github.com/vim/vim/commit/4df0772a41c361a1c40d220f6fad0b1e1653fc5b Author: lagygoill Date: Fri Mar 10 18:37:11 2023 +0000 patch 9.0.1399: highlight test script has a few problems Problem: Highlight test script has a few problems. Solution: Rewrite the script in Vim9 syntax. (closes https://github.com/vim/vim/issues/10379) diff --git a/runtime/import/dist/vimhighlight.vim b/runtime/import/dist/vimhighlight.vim new file mode 100644 --- /dev/null +++ b/runtime/import/dist/vimhighlight.vim @@ -0,0 +1,119 @@ +vim9script + +# Maintainer: github user lacygoill +# Last Change: 2023 Mar 08 + +# Init {{{1 + +const LINK: string = '->' + +# Interface {{{1 +export def HighlightTest() # {{{2 + # Open a new window if the current one isn't empty + if line('$') != 1 || getline(1) != '' + new + endif + + edit Highlight\ test + + # `:help scratch-buffer` + &l:bufhidden = 'hide' + &l:buftype = 'nofile' + &l:swapfile = false + + var report: list =<< trim END + Highlighting groups for various occasions + ----------------------------------------- + END + + var various_groups: list = GetVariousGroups() + ->filter((_, group: string): bool => group->hlexists() && !group->IsCleared()) + ->sort() + ->uniq() + + report->extend(various_groups->FollowChains()) + + var language_section: list =<< trim END + + Highlighting groups for language syntaxes + ----------------------------------------- + END + report->extend(language_section) + + var syntax_groups: list = getcompletion('', 'highlight') + ->filter((_, group: string): bool => + various_groups->index(group) == -1 + && !group->IsCleared() + && group !~ '^HighlightTest') + + # put the report + report + ->extend(syntax_groups->FollowChains()) + ->setline(1) + + # highlight the group names + execute $'silent! global /^\w\+\%(\%(\s*{LINK}\s*\)\w\+\)*$/ Highlight({bufnr('%')})' + + cursor(1, 1) +enddef +# }}}1 +# Core {{{1 +def Highlight(buf: number) # {{{2 + var lnum: number = line('.') + for group: string in getline('.')->split($'\s*{LINK}\s*') + silent! prop_type_add($'highlight-test-{group}', { + bufnr: buf, + highlight: group, + combine: false, + }) + prop_add(lnum, col('.'), { + length: group->strlen(), + type: $'highlight-test-{group}' + }) + search('\<\w\+\>', '', lnum) + endfor +enddef +# }}}1 +# Util {{{1 +def IsCleared(name: string): bool # {{{2 + return name + ->hlget() + ->get(0, {}) + ->get('cleared') +enddef + +def FollowChains(groups: list): list # {{{2 + # A group might be linked to another, which itself might be linked... + # We want the whole chain, for every group. + var chains: list + for group: string in groups + var target: string = group->LinksTo() + var chain: string = group + while !target->empty() + chain ..= $' {LINK} {target}' + target = target->LinksTo() + endwhile + var a_link_is_cleared: bool = chain + ->split($'\s*{LINK}\s*') + ->indexof((_, g: string): bool => g->IsCleared()) >= 0 + if a_link_is_cleared + continue + endif + chains->add(chain) + endfor + return chains +enddef + +def LinksTo(group: string): string # {{{2 + return group + ->hlget() + ->get(0, {}) + ->get('linksto', '') +enddef + +def GetVariousGroups(): list # {{{2 + return getcompletion('hl-', 'help') + ->filter((_, helptag: string): bool => helptag =~ '^hl-\w\+$') + ->map((_, helptag: string) => helptag->substitute('^hl-', '', '')) + ->extend(range(1, 9)->map((_, n: number) => $'User{n}')) +enddef diff --git a/runtime/syntax/hitest.vim b/runtime/syntax/hitest.vim --- a/runtime/syntax/hitest.vim +++ b/runtime/syntax/hitest.vim @@ -1,149 +1,10 @@ " Vim syntax file " Language: none; used to see highlighting -" Maintainer: Ronald Schild -" Last Change: 2019 Jun 06 -" Version: 5.4n.1 -" Additional Changes By: Lifepillar, Bram +" Maintainer: github user lacygoill +" Last Change: 2023 Mar 08 " To see your current highlight settings, do " :so $VIMRUNTIME/syntax/hitest.vim -" save global options and registers -let s:hidden = &hidden -let s:lazyredraw = &lazyredraw -let s:more = &more -let s:report = &report -let s:whichwrap = &whichwrap -let s:shortmess = &shortmess -let s:wrapscan = &wrapscan -let s:register_a = @a -let s:register_se = @/ - -" set global options -set hidden lazyredraw nomore report=99999 shortmess=aoOstTW wrapscan -set whichwrap& - -" print current highlight settings into register a -redir @a -silent highlight -redir END - -" Open a new window if the current one isn't empty -if line("$") != 1 || getline(1) != "" - new -endif - -" edit temporary file -edit Highlight\ test - -" set local options -setlocal autoindent noexpandtab formatoptions=t shiftwidth=18 noswapfile tabstop=18 -let &textwidth=&columns - -" insert highlight settings -% delete -put a - -" remove cleared groups -silent! g/ cleared$/d - -" remove the colored xxx items -g/xxx /s///e - -" remove color settings (not needed here) -global! /links to/ substitute /\s.*$//e - -" Move split 'links to' lines to the same line -% substitute /^\(\w\+\)\n\s*\(links to.*\)/\1\t\2/e - -" move linked groups to the end of file -global /links to/ move $ - -" move linked group names to the matching preferred groups -" TODO: this fails if the group linked to isn't defined -% substitute /^\(\w\+\)\s*\(links to\)\s*\(\w\+\)$/\3\t\2 \1/e -silent! global /links to/ normal mz3ElD0#$p'zdd - -" delete empty lines -global /^ *$/ delete - -" precede syntax command -% substitute /^[^ ]*/syn keyword &\t&/ - -" execute syntax commands -syntax clear -% yank a -@a - -" remove syntax commands again -% substitute /^syn keyword // - -" pretty formatting -global /^/ exe "normal Wi\\t\eAA\ex" -global /^\S/ join - -" find out first syntax highlighting -let b:various = &highlight.',:Normal,:Cursor,:,' -let b:i = 1 -while b:various =~ ':'.substitute(getline(b:i), '\s.*$', ',', '') - let b:i = b:i + 1 - if b:i > line("$") | break | endif -endwhile - -" insert headlines -call append(0, "Highlighting groups for various occasions") -call append(1, "-----------------------------------------") - -if b:i < line("$")-1 - let b:synhead = "Syntax highlighting groups" - if exists("hitest_filetypes") - redir @a - let - redir END - let @a = substitute(@a, 'did_\(\w\+\)_syn\w*_inits\s*#1', ', \1', 'g') - let @a = substitute(@a, "\n\\w[^\n]*", '', 'g') - let @a = substitute(@a, "\n", '', 'g') - let @a = substitute(@a, '^,', '', 'g') - if @a != "" - let b:synhead = b:synhead." - filetype" - if @a =~ ',' - let b:synhead = b:synhead."s" - endif - let b:synhead = b:synhead.":".@a - endif - endif - call append(b:i+1, "") - call append(b:i+2, b:synhead) - call append(b:i+3, substitute(b:synhead, '.', '-', 'g')) -endif - -" remove 'hls' highlighting -nohlsearch -normal 0 - -" we don't want to save this temporary file -set nomodified - -" the following trick avoids the "Press RETURN ..." prompt -0 append -. - -" restore global options and registers -let &hidden = s:hidden -let &lazyredraw = s:lazyredraw -let &more = s:more -let &report = s:report -let &shortmess = s:shortmess -let &whichwrap = s:whichwrap -let &wrapscan = s:wrapscan -let @a = s:register_a - -" restore last search pattern -call histdel("search", -1) -let @/ = s:register_se - -" remove variables -unlet s:hidden s:lazyredraw s:more s:report s:shortmess -unlet s:whichwrap s:wrapscan s:register_a s:register_se - -" vim: ts=8 +import 'dist/vimhighlight.vim' +call vimhighlight.HighlightTest() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1399, +/**/ 1398, /**/ 1397,