Skip to content

Commit 95e9078

Browse files
k-takatachrisbra
authored andcommitted
runtime(vim): Improve heredoc handling for all embedded scripts
* Improve heredoc handling - Support "trim" for all the embedded scripts. - Check the indent of "trim" for "let" and all the embedded scripts. * Update missing part of vim.vim.base in the commit d164f2a. * Update gen_syntax_vim.vim to catch up with 9.1.0685's source code. closes: #15542 Signed-off-by: K.Takata <kentkt@csc.jp> Signed-off-by: Doug Kearns <dougkearns@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
1 parent 25618fc commit 95e9078

3 files changed

Lines changed: 126 additions & 79 deletions

File tree

runtime/syntax/generator/gen_syntax_vim.vim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
" Language: Vim script
33
" Maintainer: Hirohito Higashi (h_east)
44
" URL: https://github.com/vim-jp/syntax-vim-ex
5-
" Last Change: 2024 Jul 18
5+
" Last Change: 2024 Aug 21
66
" Version: 2.1.1
77

88
let s:keepcpo= &cpo
@@ -526,15 +526,15 @@ function! s:parse_vim_complete_name(li)
526526
new
527527
exec 'read ' . file_name
528528
norm! gg
529-
exec '/^}\s*command_complete\[\]\s*=\s*$/+1;/^};/-1yank'
529+
exec '/^static keyvalue_T command_complete_tab\[] =$/+1;/^};$/-1yank'
530530
%delete _
531531

532532
put
533-
g!/^\s*{.*"\w\+"\s*}\s*,.*$/d
533+
g!/^\s*KEYVALUE_ENTRY(/d
534534
g/"custom\(list\)\?"/d
535535

536536
for line in getline(1, line('$'))
537-
let list = matchlist(line, '^\s*{.*"\(\w\+\)"\s*}\s*,')
537+
let list = matchlist(line, '^\s*KEYVALUE_ENTRY(EXPAND_\w\+,\s*"\(\w\+\)"')
538538
let item.name = list[1]
539539
call add(a:li, copy(item))
540540
endfor

runtime/syntax/generator/vim.vim.base

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
44
" Doug Kearns <dougkearns@gmail.com>
55
" URL: https://github.com/vim-jp/syntax-vim-ex
6-
" Last Change: 2024 Aug 16
6+
" Last Change: 2024 Aug 21
77
" Former Maintainer: Charles E. Campbell
88

99
" DO NOT CHANGE DIRECTLY.
@@ -441,11 +441,12 @@ syn match vimEscape contained "\\\o\{1,3}\|\\[xX]\x\{1,2}\|\\u\x\{1,4}\|\\U\x\{1
441441
syn match vimEscape contained "\\<" contains=vimNotation
442442
syn match vimEscape contained "\\<\*[^>]*>\=>"
443443

444-
syn region vimString oneline start=+$'+ skip=+''+ end=+'+ contains=vimStringInterpolationBrace,vimStringInterpolationExpr
445-
syn region vimString oneline start=+$"+ end=+"+ contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
444+
syn region vimString oneline start=+$'+ skip=+''+ end=+'+ contains=@vimStringInterpolation
445+
syn region vimString oneline start=+$"+ end=+"+ contains=@vimStringGroup,@vimStringInterpolation
446446
syn region vimStringInterpolationExpr oneline contained matchgroup=vimSep start=+{+ end=+}+ contains=@vimExprList
447447
syn match vimStringInterpolationBrace contained "{{"
448448
syn match vimStringInterpolationBrace contained "}}"
449+
syn cluster vimStringInterpolation contains=vimStringInterpolationExpr,vimStringInterpolationBrace
449450

450451
" Substitutions: {{{2
451452
" =============
@@ -525,13 +526,10 @@ VimL syn keyword vimUnlet unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars
525526
syn match vimUnletBang contained "!" skipwhite nextgroup=vimUnletVars
526527
syn region vimUnletVars contained start="$\I\|\h" skip="\n\s*\\" end="$" end="|" contains=vimVar,vimEnvvar,vimContinue,vimString,vimNumber
527528

528-
" Note: This incorrectly matches end markers with leading whitespace even if
529-
" "trim" was not specified. Matching :let indent for "trim" indented
530-
" end markers would require a contained :let that cannot be restricted
531-
" to the start pattern. A common internal testing use of heredocs is to
532-
" specify code blocks where :let commonly appears in the heredoc text.
533-
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*\%(trim\s\+\)\=\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1$' extend
534-
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*\%(trim\s\+\)\=eval\s\+\|eval\s\+\%(trim\s\+\)\=\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1$' contains=vimStringInterpolationExpr,vimStringInterpolationBrace extend
529+
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1\z2$' extend
530+
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\%(\s*\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1$' extend
531+
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1\z2$' contains=@vimStringInterpolation extend
532+
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1$' contains=@vimStringInterpolation extend
535533

536534
Vim9 syn keyword vim9Const const skipwhite nextgroup=vim9Variable,vim9VariableList
537535
Vim9 syn keyword vim9Final final skipwhite nextgroup=vim9Variable,vim9VariableList
@@ -934,12 +932,16 @@ if (g:vimsyn_embed =~# 'l' && has("lua")) && filereadable(s:luapath)
934932
unlet! b:current_syntax
935933
syn cluster vimFuncBodyList add=vimLuaRegion
936934
exe "syn include @vimLuaScript ".s:luapath
937-
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimLuaScript
938-
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*$+ end=+\.$+ contains=@vimLuaScript
935+
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+^\z(\s*\)lua\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimLuaScript
936+
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimLuaScript
937+
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+^\z(\s*\)lua\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimLuaScript
938+
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*$+ end=+^\.$+ contains=@vimLuaScript
939939
syn cluster vimFuncBodyList add=vimLuaRegion
940940
else
941-
syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
942-
syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
941+
syn region vimEmbedError start=+^\z(\s*\)lua\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
942+
syn region vimEmbedError start=+lua\s*<<\s*\z(\S*\)+ end=+^\z1$+
943+
syn region vimEmbedError start=+^\z(\s*\)lua\s*<<\s*trim\s\*$+ end=+^\z1\.$+
944+
syn region vimEmbedError start=+lua\s*<<\s*$+ end=+^\.$+
943945
endif
944946
unlet s:luapath
945947

@@ -957,12 +959,16 @@ if (g:vimsyn_embed =~# 'p' && has("perl")) && filereadable(s:perlpath)
957959
unlet! b:current_syntax
958960
syn cluster vimFuncBodyList add=vimPerlRegion
959961
exe "syn include @vimPerlScript ".s:perlpath
960-
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)\ze\(\s*["#].*\)\=$+ end=+^\z1\ze\(\s*[#"].*\)\=$+ contains=@vimPerlScript
961-
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
962+
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimPerlScript
963+
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimPerlScript
964+
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimPerlScript
965+
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
962966
syn cluster vimFuncBodyList add=vimPerlRegion
963967
else
964-
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
965-
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
968+
syn region vimEmbedError start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
969+
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(\S*\)+ end=+^\z1$+
970+
syn region vimEmbedError start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
971+
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+^\.$+
966972
endif
967973
unlet s:perlpath
968974

@@ -980,12 +986,16 @@ if (g:vimsyn_embed =~# 'r' && has("ruby")) && filereadable(s:rubypath)
980986
syn cluster vimFuncBodyList add=vimRubyRegion
981987
unlet! b:current_syntax
982988
exe "syn include @vimRubyScript ".s:rubypath
983-
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimRubyScript
984-
syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
989+
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimRubyScript
990+
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub\%[y]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimRubyScript
991+
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimRubyScript
992+
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub\%[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
985993
syn cluster vimFuncBodyList add=vimRubyRegion
986994
else
987-
syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
988-
syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
995+
syn region vimEmbedError start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
996+
syn region vimEmbedError start=+rub\%[y]\s*<<\s*\z(\S.*\)+ end=+^\z1$+
997+
syn region vimEmbedError start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
998+
syn region vimEmbedError start=+rub\%[y]\s*<<\s*$+ end=+^\.$+
989999
endif
9901000
unlet s:rubypath
9911001

@@ -1003,14 +1013,18 @@ if g:vimsyn_embed =~# 'P' && has("pythonx") && filereadable(s:pythonpath)
10031013
unlet! b:current_syntax
10041014
syn cluster vimFuncBodyList add=vimPythonRegion
10051015
exe "syn include @vimPythonScript ".s:pythonpath
1006-
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
1007-
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
1008-
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
1009-
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
1016+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimPythonScript
1017+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\z(\S\+\)+ end=+^\z1$+ contains=@vimPythonScript
1018+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimPythonScript
1019+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*$+ end=+^\.$+ contains=@vimPythonScript
1020+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S\+\)+ end=+^\z1$+ contains=@vimPythonScript
1021+
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=$+ end=+^\.$+ contains=@vimPythonScript
10101022
syn cluster vimFuncBodyList add=vimPythonRegion
10111023
else
1012-
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
1013-
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+
1024+
syn region vimEmbedError start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
1025+
syn region vimEmbedError start=+py\%[thon][3x]\=\s*<<\s*\z(\S\+\)+ end=+^\z1$+
1026+
syn region vimEmbedError start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s*$+ end=+^\z1\.$+
1027+
syn region vimEmbedError start=+py\%[thon][3x]\=\s*<<\s*$+ end=+^\.$+
10141028
endif
10151029
unlet s:pythonpath
10161030

@@ -1035,17 +1049,23 @@ if s:trytcl
10351049
unlet! b:current_syntax
10361050
syn cluster vimFuncBodyList add=vimTclRegion
10371051
exe "syn include @vimTclScript ".s:tclpath
1038-
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimTclScript
1039-
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*$+ end=+\.$+ contains=@vimTclScript
1052+
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimTclScript
1053+
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimTclScript
1054+
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimTclScript
1055+
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc\%[l]\=\s*<<\s*$+ end=+^\.$+ contains=@vimTclScript
10401056
syn cluster vimFuncBodyList add=vimTclScript
10411057
else
1042-
syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
1043-
syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
1058+
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
1059+
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+
1060+
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
1061+
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*$+ end=+^\.$+
10441062
endif
10451063
unlet s:tclpath
10461064
else
1047-
syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
1048-
syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
1065+
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
1066+
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+
1067+
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
1068+
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*$+ end=+^\.$+
10491069
endif
10501070
unlet s:trytcl
10511071

@@ -1066,12 +1086,16 @@ if (g:vimsyn_embed =~# 'm' && has("mzscheme")) && filereadable(s:mzschemepath)
10661086
exe "syn include @vimMzSchemeScript ".s:mzschemepath
10671087
let &isk= s:iskKeep
10681088
unlet s:iskKeep
1069-
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimMzSchemeScript
1070-
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+ contains=@vimMzSchemeScript
1089+
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimMzSchemeScript
1090+
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimMzSchemeScript
1091+
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimMzSchemeScript
1092+
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*$+ end=+^\.$+ contains=@vimMzSchemeScript
10711093
syn cluster vimFuncBodyList add=vimMzSchemeRegion
10721094
else
1073-
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
1074-
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
1095+
syn region vimEmbedError start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
1096+
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(\S*\)+ end=+^\z1$+
1097+
syn region vimEmbedError start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
1098+
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+^\.$+
10751099
endif
10761100
unlet s:mzschemepath
10771101

0 commit comments

Comments
 (0)