diff --git a/runtime/import/dist/vimhighlight.vim b/runtime/import/dist/vimhighlight.vim
new file mode 100644
index 0000000..4664961
--- /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
