summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorlagygoill <lacygoill@lacygoill.me>2023-03-10 18:37:11 +0000
committerBram Moolenaar <Bram@vim.org>2023-03-10 18:37:11 +0000
commit4df0772a41c361a1c40d220f6fad0b1e1653fc5b (patch)
treed3611ca8d53da5191cb168e59e9d1142096e89d0 /runtime
parentc0bdbfb2ee026e913e23a5d6bcaa97d44d9a6406 (diff)
downloadvim-git-4df0772a41c361a1c40d220f6fad0b1e1653fc5b.tar.gz
patch 9.0.1399: highlight test script has a few problemsv9.0.1399
Problem: Highlight test script has a few problems. Solution: Rewrite the script in Vim9 syntax. (closes #10379)
Diffstat (limited to 'runtime')
-rw-r--r--runtime/import/dist/vimhighlight.vim119
-rw-r--r--runtime/syntax/hitest.vim147
2 files changed, 123 insertions, 143 deletions
diff --git a/runtime/import/dist/vimhighlight.vim b/runtime/import/dist/vimhighlight.vim
new file mode 100644
index 000000000..4664961af
--- /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
diff --git a/runtime/syntax/hitest.vim b/runtime/syntax/hitest.vim
index 9d60cec80..27b8eab73 100644
--- 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()