1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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
|