Skip to content

Commit

Permalink
patch 9.0.1399: highlight test script has a few problems
Browse files Browse the repository at this point in the history
Problem:    Highlight test script has a few problems.
Solution:   Rewrite the script in Vim9 syntax. (closes #10379)
  • Loading branch information
lagygoill authored and brammool committed Mar 10, 2023
1 parent c0bdbfb commit 4df0772
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 143 deletions.
119 changes: 119 additions & 0 deletions runtime/import/dist/vimhighlight.vim
Original file line number Diff line number Diff line change
@@ -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
147 changes: 4 additions & 143 deletions runtime/syntax/hitest.vim
Original file line number Diff line number Diff line change
@@ -1,149 +1,10 @@
" Vim syntax file
" Language: none; used to see highlighting
" Maintainer: Ronald Schild <rs@scutum.de>
" Last Change: 2019 Jun 06
" Version: 5.4n.1
" Additional Changes By: Lifepillar, Bram
" Maintainer: github user lacygoill
" Last Change: 2023 Mar 08

" To see your current highlight settings, do
" :so $VIMRUNTIME/syntax/hitest.vim

" save global options and registers
let s:hidden = &hidden
let s:lazyredraw = &lazyredraw
let s:more = &more
let s:report = &report
let s:whichwrap = &whichwrap
let s:shortmess = &shortmess
let s:wrapscan = &wrapscan
let s:register_a = @a
let s:register_se = @/

" set global options
set hidden lazyredraw nomore report=99999 shortmess=aoOstTW wrapscan
set whichwrap&

" print current highlight settings into register a
redir @a
silent highlight
redir END

" Open a new window if the current one isn't empty
if line("$") != 1 || getline(1) != ""
new
endif

" edit temporary file
edit Highlight\ test

" set local options
setlocal autoindent noexpandtab formatoptions=t shiftwidth=18 noswapfile tabstop=18
let &textwidth=&columns

" insert highlight settings
% delete
put a

" remove cleared groups
silent! g/ cleared$/d

" remove the colored xxx items
g/xxx /s///e

" remove color settings (not needed here)
global! /links to/ substitute /\s.*$//e

" Move split 'links to' lines to the same line
% substitute /^\(\w\+\)\n\s*\(links to.*\)/\1\t\2/e

" move linked groups to the end of file
global /links to/ move $

" move linked group names to the matching preferred groups
" TODO: this fails if the group linked to isn't defined
% substitute /^\(\w\+\)\s*\(links to\)\s*\(\w\+\)$/\3\t\2 \1/e
silent! global /links to/ normal mz3ElD0#$p'zdd

" delete empty lines
global /^ *$/ delete

" precede syntax command
% substitute /^[^ ]*/syn keyword &\t&/

" execute syntax commands
syntax clear
% yank a
@a

" remove syntax commands again
% substitute /^syn keyword //

" pretty formatting
global /^/ exe "normal Wi\<CR>\t\eAA\ex"
global /^\S/ join

" find out first syntax highlighting
let b:various = &highlight.',:Normal,:Cursor,:,'
let b:i = 1
while b:various =~ ':'.substitute(getline(b:i), '\s.*$', ',', '')
let b:i = b:i + 1
if b:i > line("$") | break | endif
endwhile

" insert headlines
call append(0, "Highlighting groups for various occasions")
call append(1, "-----------------------------------------")

if b:i < line("$")-1
let b:synhead = "Syntax highlighting groups"
if exists("hitest_filetypes")
redir @a
let
redir END
let @a = substitute(@a, 'did_\(\w\+\)_syn\w*_inits\s*#1', ', \1', 'g')
let @a = substitute(@a, "\n\\w[^\n]*", '', 'g')
let @a = substitute(@a, "\n", '', 'g')
let @a = substitute(@a, '^,', '', 'g')
if @a != ""
let b:synhead = b:synhead." - filetype"
if @a =~ ','
let b:synhead = b:synhead."s"
endif
let b:synhead = b:synhead.":".@a
endif
endif
call append(b:i+1, "")
call append(b:i+2, b:synhead)
call append(b:i+3, substitute(b:synhead, '.', '-', 'g'))
endif

" remove 'hls' highlighting
nohlsearch
normal 0

" we don't want to save this temporary file
set nomodified

" the following trick avoids the "Press RETURN ..." prompt
0 append
.

" restore global options and registers
let &hidden = s:hidden
let &lazyredraw = s:lazyredraw
let &more = s:more
let &report = s:report
let &shortmess = s:shortmess
let &whichwrap = s:whichwrap
let &wrapscan = s:wrapscan
let @a = s:register_a

" restore last search pattern
call histdel("search", -1)
let @/ = s:register_se

" remove variables
unlet s:hidden s:lazyredraw s:more s:report s:shortmess
unlet s:whichwrap s:wrapscan s:register_a s:register_se

" vim: ts=8
import 'dist/vimhighlight.vim'
call vimhighlight.HighlightTest()
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1399,
/**/
1398,
/**/
Expand Down

0 comments on commit 4df0772

Please sign in to comment.