mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			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 |