120 lines
3.2 KiB
VimL
120 lines
3.2 KiB
VimL
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
|