commit 62135f5a578a8e9894c511ebf37855ce7b2e1917
parent 8a79e3398a347248f067abe0c09097416fbf9cae
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sun, 1 Mar 2026 08:13:19 +0800
vim-patch:b901fa9: runtime(vim): Update base syntax, improve :syntax group list arg matching (#38112)
Attempt to match all variations of group name and comma separator across
continuation lines.
Fixes issues:
- vim/vim#18491 (Two ")"s are incorrectly colored 'vimOperError' in
syntax/mail.vim), reported by @lkintact
- vim/vim#19366 (highlight error for contains elements in a new line), reported
by Maxim Kim
fixes: vim/vim#18491
fixes: vim/vim#19366
https://github.com/vim/vim/commit/b901fa9a6adbc0b1404b1e6c19f83941820b1d91
Co-authored-by: Doug Kearns <dougkearns@gmail.com>
Diffstat:
1 file changed, 36 insertions(+), 17 deletions(-)
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
@@ -1779,17 +1779,32 @@ Vim9 syn match vimWincmd "\s\=\<winc\%[md]\>\ze\s\+=\s*\%([#|]\|$\)" skipwhite n
" Syntax: {{{2
"=======
-syn match vimGroupList contained "[^[:space:],]\+\%(\s*,\s*[^[:space:],]\+\)*" contains=vimGroupSpecial
-syn region vimGroupList contained start=/^\s*["#]\\ \|^\s*\\\|[^[:space:],]\+\s*,/ skip=/\s*\n\s*\%(\\\|["#]\\ \)\|^\s*\%(\\\|["#]\\ \)/ end=/[^[:space:],]\s*$\|[^[:space:],]\ze\s\+\w/ contains=@vimContinue,vimGroupSpecial
+syn region vimGroupList contained
+ \ start="\S"
+ \ skip=+\n\s*\%(\\\|["#]\\ \)+
+ "\ need to consume the whitespace
+ \ end="\s"he=e-1
+ \ end="$"
+ \ contains=@vimGroupListContinue,vimGroupSpecial,vimGroupListContinueComma
syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP
+syn match vimGroupListComma contained ","
+syn match vimGroupListContinueComma contained "\s\+,\s*\|,\s\+" contains=vimGroupListComma
+syn match vimGroupListContinueComma contained "\s*,\s*\%(\n\s*\%(\\\s\+\|["#]\\ .*\)\)\+" contains=@vimGroupListContinue,vimGroupListComma
+
+syn match vimGroupListEquals contained "=" skipwhite skipnl nextgroup=vimGroupListContinueStart,vimGroupList
+" the first continuation line does not terminate the list at whitepace after \
+syn match vimGroupListContinueStart contained "^\%(\s*["#]\\ .*\n\)*\s*\\\s\+" skipwhite nextgroup=vimGroupList contains=@vimGroupListContinue transparent
+
+syn match vimGroupListContinue contained "^\s*\\" skipwhite skipnl nextgroup=@vimGroupListContinue,vimGroupListContinueComma contains=vimWhitespace
+syn match vimGroupListContinueComment contained '^\s*["#]\\ .*' skipwhite skipnl nextgroup=@vimGroupListContinue contains=vimWhitespace
+syn cluster vimGroupListContinue contains=vimGroupListContinue,vimGroupListContinueComment
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror")
- syn match vimSynError contained "\i\+"
- syn match vimSynError contained "\i\+=" nextgroup=vimGroupList
+ syn match vimSynError contained "\i\+"
endif
-syn match vimSynContains contained "\<contain\%(s\|edin\)=" skipwhite skipnl nextgroup=vimGroupList
-syn match vimSynKeyContainedin contained "\<containedin=" skipwhite skipnl nextgroup=vimGroupList
-syn match vimSynNextgroup contained "\<nextgroup=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimSynContains contained "\<contains\>" skipwhite nextgroup=vimGroupListEquals
+syn match vimSynContainedin contained "\<containedin\>" skipwhite nextgroup=vimGroupListEquals
+syn match vimSynNextgroup contained "\<nextgroup\>" skipwhite nextgroup=vimGroupListEquals
if has("conceal")
" no whitespace allowed after '='
syn match vimSynCchar contained "\<cchar=" nextgroup=vimSynCcharValue
@@ -1807,13 +1822,13 @@ endif
syn keyword vimSynCase contained ignore match
" Syntax: clear {{{2
-syn keyword vimSynType contained clear skipwhite nextgroup=vimGroupList
+syn keyword vimSynType contained clear
" Syntax: cluster {{{2
syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName
syn region vimClusterName contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="$\||" contains=@vimContinue,vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
-syn match vimGroupAdd contained keepend "\<add=" skipwhite skipnl nextgroup=vimGroupList
-syn match vimGroupRem contained keepend "\<remove=" skipwhite skipnl nextgroup=vimGroupList
+syn match vimGroupAdd contained "\<add\>" skipwhite nextgroup=vimGroupListEquals
+syn match vimGroupRem contained "\<remove\>" skipwhite nextgroup=vimGroupListEquals
" Syntax: conceal {{{2
syn match vimSynType contained "\<conceal\>" skipwhite nextgroup=vimSynConceal,vimSynConcealError
@@ -1836,16 +1851,17 @@ syn match vimSynIskeyword contained "\S\+" contains=vimSynIskeywordSep
syn match vimSynIskeywordSep contained ","
" Syntax: include {{{2
-syn keyword vimSynType contained include skipwhite nextgroup=vimGroupList
+syn keyword vimSynType contained include skipwhite nextgroup=vimSynIncludeCluster
+syn match vimSynIncludeCluster contained "@[_a-zA-Z0-9]\+\>"
" Syntax: keyword {{{2
-syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
+syn cluster vimSynKeyGroup contains=@vimContinue,vimSynCchar,vimSynNextgroup,vimSynKeyOpt,vimSynContainedin
syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion
syn region vimSynKeyRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynKeyGroup
syn match vimSynKeyOpt contained "\%#=1\<\%(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
" Syntax: match {{{2
-syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation,vimMtchComment
+syn cluster vimSynMtchGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation,vimMtchComment
syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*\>" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynMtchGroup
syn match vimSynMtchOpt contained "\%#=1\<\%(conceal\|transparent\|contained\|excludenl\|keepend\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
@@ -1855,9 +1871,9 @@ syn keyword vimSynType contained enable list manual off on reset
" Syntax: region {{{2
syn cluster vimSynRegPatGroup contains=@vimContinue,vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
-syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
+syn cluster vimSynRegGroup contains=@vimContinue,vimSynCchar,vimSynContains,vimSynContainedin,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
syn keyword vimSynType contained region skipwhite nextgroup=vimSynRegion
-syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip=+\\\\\|\\\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynRegGroup
+syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip=+\\\\\|\\|\|\n\s*\%(\\\|"\\ \)+ matchgroup=vimCmdSep end="|\|$" contains=@vimSynRegGroup
syn match vimSynRegOpt contained "\%#=1\<\%(conceal\%(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
syn match vimSynReg contained "\<\%(start\|skip\|end\)=" nextgroup=vimSynRegPat
syn match vimSynMtchGrp contained "matchgroup=" nextgroup=vimGroup,vimHLGroup,vimOnlyHLGroup,nvimHLGroup
@@ -2518,11 +2534,14 @@ if !exists("skip_vim_syntax_inits")
hi def link vimGrep vimCommand
hi def link vimGrepadd vimCommand
hi def link vimGrepBang vimBang
+ hi def link vimGroup Type
hi def link vimGroupAdd vimSynOption
+ hi def link vimGroupListEquals vimSynOption
+ hi def link vimGroupListContinue vimContinue
+ hi def link vimGroupListContinueComment vimContinueComment
hi def link vimGroupName Normal
hi def link vimGroupRem vimSynOption
hi def link vimGroupSpecial Special
- hi def link vimGroup Type
hi def link vimHelp vimCommand
hi def link vimHelpBang vimBang
hi def link vimHelpgrep vimCommand
@@ -2688,7 +2707,7 @@ if !exists("skip_vim_syntax_inits")
hi def link vimSynFoldlevel Type
hi def link vimSynIskeyword Type
hi def link vimSynIskeywordSep Delimiter
- hi def link vimSynKeyContainedin vimSynContains
+ hi def link vimSynContainedin vimSynContains
hi def link vimSynKeyOpt vimSynOption
hi def link vimSynMtchGrp vimSynOption
hi def link vimSynMtchOpt vimSynOption