mirror of
https://github.com/vim/vim
synced 2025-07-16 01:01:58 +00:00
patch 9.0.1399: highlight test script has a few problems
Problem: Highlight test script has a few problems. Solution: Rewrite the script in Vim9 syntax. (closes #10379)
This commit is contained in:
committed by
Bram Moolenaar
parent
c0bdbfb2ee
commit
4df0772a41
119
runtime/import/dist/vimhighlight.vim
vendored
Normal file
119
runtime/import/dist/vimhighlight.vim
vendored
Normal file
@ -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
|
@ -1,149 +1,10 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: none; used to see highlighting
|
" Language: none; used to see highlighting
|
||||||
" Maintainer: Ronald Schild <rs@scutum.de>
|
" Maintainer: github user lacygoill
|
||||||
" Last Change: 2019 Jun 06
|
" Last Change: 2023 Mar 08
|
||||||
" Version: 5.4n.1
|
|
||||||
" Additional Changes By: Lifepillar, Bram
|
|
||||||
|
|
||||||
" To see your current highlight settings, do
|
" To see your current highlight settings, do
|
||||||
" :so $VIMRUNTIME/syntax/hitest.vim
|
" :so $VIMRUNTIME/syntax/hitest.vim
|
||||||
|
|
||||||
" save global options and registers
|
import 'dist/vimhighlight.vim'
|
||||||
let s:hidden = &hidden
|
call vimhighlight.HighlightTest()
|
||||||
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
|
|
||||||
|
@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1399,
|
||||||
/**/
|
/**/
|
||||||
1398,
|
1398,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user