summaryrefslogtreecommitdiff
path: root/runtime/import/dist/vimhighlight.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/import/dist/vimhighlight.vim')
-rw-r--r--runtime/import/dist/vimhighlight.vim119
1 files changed, 119 insertions, 0 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