changeset 32136:50e447c67247 v9.0.1399

patch 9.0.1399: highlight test script has a few problems Commit: https://github.com/vim/vim/commit/4df0772a41c361a1c40d220f6fad0b1e1653fc5b Author: lagygoill <lacygoill@lacygoill.me> 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)
author Bram Moolenaar <Bram@vim.org>
date Fri, 10 Mar 2023 19:45:05 +0100
parents 8784e64ab285
children 799e9cb2699d
files runtime/import/dist/vimhighlight.vim runtime/syntax/hitest.vim src/version.c
diffstat 3 files changed, 125 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
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<string> =<< trim END
+        Highlighting groups for various occasions
+        -----------------------------------------
+    END
+
+    var various_groups: list<string> = GetVariousGroups()
+        ->filter((_, group: string): bool => group->hlexists() && !group->IsCleared())
+        ->sort()
+        ->uniq()
+
+    report->extend(various_groups->FollowChains())
+
+    var language_section: list<string> =<< trim END
+
+        Highlighting groups for language syntaxes
+        -----------------------------------------
+    END
+    report->extend(language_section)
+
+    var syntax_groups: list<string> = 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<string>): list<string> # {{{2
+    # A group might be linked to another, which itself might be linked...
+    # We want the whole chain, for every group.
+    var chains: list<string>
+    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<string> # {{{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
--- 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 <rs@scutum.de>
-" 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\<CR>\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()
--- 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,