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 #10379)
This commit is contained in:
committed by
Bram Moolenaar
parent
c0bdbfb2ee
commit
4df0772a41
119
runtime/import/dist/vimhighlight.vim
vendored
Normal file
119
runtime/import/dist/vimhighlight.vim
vendored
Normal file
@ -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
|
Reference in New Issue
Block a user