runtime(vim): Update base-syntax, improve :echo highlighting (#14103)

Commit: 
https://github.com/vim/vim/commit/b1427b46f5fe50a1daba102c4017d0ef2624b3ba
Author: dkearns <[email protected]>
Date:   Wed Feb 28 05:59:30 2024 +1100

    runtime(vim): Update base-syntax, improve :echo highlighting 
(https://github.com/vim/vim/issues/14103)
    
    - Normalise behaviour of :echo commands and improve expression matching.
    - Allow continued argument lines.
    - Refine string interpolation groups.
    - Remove duplicated :menu and :map generated commands that are handled
      specially later in the file.
    
    Signed-off-by: Doug Kearns <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/runtime/syntax/generator/gen_syntax_vim.vim 
b/runtime/syntax/generator/gen_syntax_vim.vim
index bc561dd6c..bbcdb0607 100644
--- a/runtime/syntax/generator/gen_syntax_vim.vim
+++ b/runtime/syntax/generator/gen_syntax_vim.vim
@@ -2,8 +2,8 @@
 " Language: Vim script
 " Maintainer: Hirohito Higashi (h_east)
 " URL: https://github.com/vim-jp/syntax-vim-ex
-" Last Change: Feb 18, 2024
-" Version: 2.0.1
+" Last Change: Feb 27, 2024
+" Version: 2.0.3
 
 let s:keepcpo= &cpo
 set cpo&vim
@@ -264,20 +264,23 @@ function! s:get_vim_command_type(cmd_name)
        " Return value:
        "   0: normal
        "   1: (Reserved)
-       "   2: abbrev (without un)
-       "   3: menu
-       "   4: map
-       "   5: mapclear
-       "   6: unmap
+       "   2: abbrev
+       "   3: echo
+       "   4: menu
+       "   5: map
+       "   6: mapclear
+       "   7: unmap
        "   99: (Exclude registration of "syn keyword")
        let menu_prefix = '^\%([acinosvx]\?\|tl\)'
        let map_prefix  = '^[acilnostvx]\?'
+       let echo_suffix = '\%(n\|hl\|msg\|window\|err\|console\|\)$'
        let exclude_list = [
        \       'map', 'mapclear',
        \       'substitute', 'smagic', 'snomagic',
        \       'setlocal', 'setglobal', 'set', 'var',
        \       'autocmd', 'doautocmd', 'doautoall',
-       \       'echo', 'echohl', 'execute',
+       \       'echohl',
+       \ 'execute',
        \       'behave', 'augroup', 'normal', 'syntax',
        \       'append', 'insert',
        \       'Next', 'Print', 'X',
@@ -290,14 +293,16 @@ function! s:get_vim_command_type(cmd_name)
                let ret = 99
        elseif a:cmd_name =~# 
'^\%(\%(un\)\?abbreviate\|noreabbrev\|\l\%(nore\|un\)\?abbrev\)$'
                let ret = 2
-       elseif a:cmd_name =~# menu_prefix . '\%(nore\|un\)\?menu$'
+       elseif a:cmd_name =~# '^echo' . echo_suffix
                let ret = 3
-       elseif a:cmd_name =~# map_prefix . '\%(nore\)\?map$'
+       elseif a:cmd_name =~# menu_prefix . '\%(nore\|un\)\?menu$'
                let ret = 4
-       elseif a:cmd_name =~# map_prefix . 'mapclear$'
+       elseif a:cmd_name =~# map_prefix . '\%(nore\)\?map$'
                let ret = 5
-       elseif a:cmd_name =~# map_prefix . 'unmap$'
+       elseif a:cmd_name =~# map_prefix . 'mapclear$'
                let ret = 6
+       elseif a:cmd_name =~# map_prefix . 'unmap$'
+               let ret = 7
        else
                let ret = 0
        endif
@@ -566,10 +571,6 @@ function! s:update_syntax_vim_file(vim_info)
                " vimCommand - normal
                let lnum = s:search_and_check('vimCommand normal', base_fname, 
str_info)
                let lnum = s:append_syn_vimcmd(lnum, str_info, li, 0)
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 3)           
" menu
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 4)           
" map
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 5)           
" mapclear
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 6)           
" unmap
 
                " vimOption
                let kword = 'vimOption'
@@ -620,16 +621,19 @@ function! s:update_syntax_vim_file(vim_info)
                let li = a:vim_info.cmd
                let lnum = s:search_and_check(kword . ' abbrev', base_fname, 
str_info)
                let lnum = s:append_syn_vimcmd(lnum, str_info, li, 2)
+               " vimCommand - echo
+               let lnum = s:search_and_check(kword . ' echo', base_fname, 
str_info)
+               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 3)
+               " vimCommand - menu
+               let lnum = s:search_and_check(kword . ' menu', base_fname, 
str_info)
+               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 4)
                " vimCommand - map
                let lnum = s:search_and_check(kword . ' map', base_fname, 
str_info)
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 4)
-               let lnum = s:search_and_check(kword . ' mapclear', base_fname, 
str_info)
                let lnum = s:append_syn_vimcmd(lnum, str_info, li, 5)
-               let lnum = s:search_and_check(kword . ' unmap', base_fname, 
str_info)
+               let lnum = s:search_and_check(kword . ' mapclear', base_fname, 
str_info)
                let lnum = s:append_syn_vimcmd(lnum, str_info, li, 6)
-               " vimCommand - menu
-               let lnum = s:search_and_check(kword . ' menu', base_fname, 
str_info)
-               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 3)
+               let lnum = s:search_and_check(kword . ' unmap', base_fname, 
str_info)
+               let lnum = s:append_syn_vimcmd(lnum, str_info, li, 7)
 
                update
                quit!
diff --git a/runtime/syntax/generator/vim.vim.base 
b/runtime/syntax/generator/vim.vim.base
index 6527fe178..f74406e49 100644
--- a/runtime/syntax/generator/vim.vim.base
+++ b/runtime/syntax/generator/vim.vim.base
@@ -3,7 +3,7 @@
 " Maintainer:  Hirohito Higashi <h.east.727 ATMARK gmail.com>
 "      Doug Kearns <[email protected]>
 " URL: https://github.com/vim-jp/syntax-vim-ex
-" Last Change: Feb 18, 2024
+" Last Change: Feb 27, 2024
 " Former Maintainer: Charles E. Campbell
 " Base File URL:     http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
 " Base File Version: 9.0-25
@@ -176,6 +176,8 @@ syn match vimVar            "\s\zs&t_k;"
 syn match vimFBVar      contained   "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
 syn keyword vimCommand  contained      in
 
+syn cluster vimExprList 
contains=vimEnvvar,vimFunc,vimFuncVar,vimNumber,vimOper,vimOperParen,vimLetRegister,vimString,vimVar
+
 " Insertions And Appends: insert append {{{2
 "   (buftype != nofile test avoids having append, change, insert show up in 
the command window)
 " =======================
@@ -344,11 +346,11 @@ syn match vimEscape       contained       
"\\o\{1,3}\|\[xX]\x\{1,2}\|\u\x\{1,4}\|\U\x\{1
 syn match      vimEscape       contained       "\<" contains=vimNotation
 syn match      vimEscape       contained       "\<\*[^>]*>\=>"
 
-syn region     vimString start=+$'+ end=+'+ skip=+''+ oneline 
contains=vimStringInterpolationBrace,vimStringInterpolationExpr
-syn region     vimString start=+$"+ end=+"+ oneline 
contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
-syn region     vimStringInterpolationExpr matchgroup=vimSep start=+{+ end=+}+ 
oneline 
contains=vimFunc,vimFuncVar,vimOper,vimOperParen,vimNotation,vimNumber,vimString,vimVar
-syn match      vimStringInterpolationBrace "{{"
-syn match      vimStringInterpolationBrace "}}"
+syn region     vimString       oneline start=+$'+ skip=+''+ end=+'+ 
contains=vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region     vimString       oneline start=+$"+ end=+"+ 
contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region     vimStringInterpolationExpr  oneline contained matchgroup=vimSep 
start=+{+ end=+}+ contains=@vimExprList
+syn match      vimStringInterpolationBrace contained "{{"
+syn match      vimStringInterpolationBrace contained "}}"
 
 " Substitutions: {{{2
 " =============
@@ -442,13 +444,16 @@ syn match vimAutoCmdMod   "\(++\)\=\(once\|nested\)"
 
 " Echo And Execute: -- prefer strings! {{{2
 " ================
-syn region     vimEcho oneline excludenl matchgroup=vimCommand 
start="\<ec\%[ho]\>" skip="\(\\\)*\|" end="$\||" 
contains=vimFunc,vimFuncVar,vimString,vimVar
-syn region     vimExecute      oneline excludenl matchgroup=vimCommand 
start="\<exe\%[cute]\>" skip="\(\\\)*\|" end="$\||\|<[cC][rR]>" 
contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
-syn match      vimEchoHL       "echohl\="      skipwhite 
nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
+" GEN_SYN_VIM: vimCommand echo, START_STR='syn keyword vimEcho', 
END_STR='skipwhite nextgroup=vimEchoExpr'
+syn region     vimEchoExpr     contained       start="[^[:space:]|]" 
skip=+\\\|\|\|
\s*\\|
\s*"\ + matchgroup=vimCmdSep end="|" end="$" contains=@vimContinue,@vimExprList
+
+syn match      vimEchoHL       "\<echohl\=\>"  skipwhite 
nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
 syn case ignore
 syn keyword    vimEchoHLNone   none
 syn case match
 
+syn region     vimExecute      oneline excludenl matchgroup=vimCommand 
start="\<exe\%[cute]\>" skip="\(\\\)*\|" end="$\||\|<[cC][rR]>" 
contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
+
 " Maps: {{{2
 " ====
 syn match      vimMap          "\<map\>\ze\s*(\@!"         skipwhite 
nextgroup=vimMapMod,vimMapLhs
@@ -949,6 +954,7 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimContinue       Special
  hi def link vimContinueComment        vimComment
  hi def link vimCtrlChar       SpecialChar
+ hi def link vimEcho   vimCommand
  hi def link vimEchoHLNone     vimGroup
  hi def link vimEchoHL vimCommand
  hi def link vimElseIfErr      Error
diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump 
b/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump
new file mode 100644
index 000000000..506c9e2d8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_echo_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|e|c|h|o| |c|o|m@1|a|n|d|s| +0#0000000&@54
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&@7|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|n| +0#0000000&@6|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@1|"+0#e000002&|A|n|s|w|e|r| |=| 
|"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| 
|"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|f|o|l@1|o|w|i|n|g| 
|c|o|m@1|a|n|d| |i|s| |:|||"| +0#0000000&||| ||| @40
+@75
+|e+0#af5f00255&|c|h|o|h|l| +0#0000000&|W+0#00e0003&|a|r|n|i|n|g|M|s|g| 
+0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|D|o|n|'|t| 
|p|a|n|i|c|!|"| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| 
+0#0000000&|N+0#00e0003&|o|n|e| +0#0000000&@21
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&@58
+@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|"+0#0000e05&| |:|e|c|h|o| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@52
+|e+0#af5f00255&|c|h|o||+0#0000000&| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+|"|i|n|p|u|t|/|v|i|m|_|e|x|_|e|c|h|o|.|v|i|m|"| |2|0|L|,| |3|6|2|B| @23|1|,|1| 
@10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump 
b/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump
new file mode 100644
index 000000000..e8dd4541b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_echo_99.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|e+0#af5f00255&|c|h|o| +0#0000000&@7|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|n| +0#0000000&@6|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|m|s|g| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|w|i|n|d|o|w| +0#0000000&@1|"+0#e000002&|A|n|s|w|e|r| |=| 
|"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|e|r@1| +0#0000000&@4|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&|4+0#e000002&|2| +0#0000000&@48
+|e+0#af5f00255&|c|h|o|c|o|n|s|o|l|e| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| 
|"| +0#0000000&|4+0#e000002&|2| +0#0000000&@48
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|f|o|l@1|o|w|i|n|g| 
|c|o|m@1|a|n|d| |i|s| |:|||"| +0#0000000&||| ||| @40
+@75
+|e+0#af5f00255&|c|h|o|h|l| +0#0000000&|W+0#00e0003&|a|r|n|i|n|g|M|s|g| 
+0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|D|o|n|'|t| 
|p|a|n|i|c|!|"| +0#0000000&||| |e+0#af5f00255&|c|h|o|h|l| 
+0#0000000&|N+0#00e0003&|o|n|e| +0#0000000&@21
+@75
+|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|A|n|s|w|e|r| |=| |"| 
+0#0000000&@58
+@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@64
+@75
+|"+0#0000e05&| |:|e|c|h|o| |w|i|t|h|o|u|t| |{|e|x|p|r|}| +0#0000000&@52
+|e+0#af5f00255&|c|h|o||+0#0000000&| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@58
+> @74
+@57|2|0|,|0|-|1| @7|B|o|t| 
diff --git a/runtime/syntax/testdir/input/vim_ex_echo.vim 
b/runtime/syntax/testdir/input/vim_ex_echo.vim
new file mode 100644
index 000000000..c031724b8
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_echo.vim
@@ -0,0 +1,20 @@
+" Vim :echo commands
+
+echo        "Answer = " 42
+echon       "Answer = " 42
+echomsg     "Answer = " 42
+echowindow  "Answer = " 42
+echoerr     "Answer = " 42
+echoconsole "Answer = " 42
+
+echo "following command is :|" | |
+
+echohl WarningMsg | echo "Don't panic!" | echohl None
+
+echo "Answer = "
+     "\ comment
+      \ 42
+
+" :echo without {expr}
+echo| echo "Foo"
+
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index c845651c9..0532a48e8 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -29,16 +29,12 @@ syn cluster vimCommentGroup contains=vimTodo,@Spell
 " regular vim commands {{{2
 " GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand 
contained', END_STR=''
 syn keyword vimCommand contained abc[lear] abo[veleft] abs[tract] al[l] ar[gs] 
arga[dd] argd[elete] argdo argded[upe] arge[dit] argg[lobal] argl[ocal] 
argu[ment] as[cii] b[uffer] bN[ext] ba[ll] bad[d] balt bd[elete] bel[owright] 
bf[irst] bl[ast] bm[odified] bn[ext] bo[tright] bp[revious] br[ewind] brea[k] 
breaka[dd] breakd[el] breakl[ist] bro[wse] buffers bufd[o] bun[load] bw[ipeout] 
c[hange] cN[ext] cNf[ile] cabc[lear] cabo[ve] cad[dbuffer] cadde[xpr] 
caddf[ile] caf[ter] cal[l] cat[ch] cb[uffer] cbe[fore] cbel[ow] cbo[ttom] cc 
ccl[ose] cd cdo ce[nter] cex[pr] cf[ile] cfd[o] cfir[st] cg[etfile] 
cgetb[uffer] cgete[xpr] chd[ir] changes che[ckpath] checkt[ime] chi[story] 
cl[ist] cla[st] class clo[se] cle[arjumps] cn[ext] cnew[er] cnf[ile] co[py] 
col[der] colo[rscheme]
-syn keyword vimCommand contained com[mand] comc[lear] comp[iler] con[tinue] 
conf[irm] cons[t] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] 
cst[ag] cw[indow] d[elete] delm[arks] deb[ug] debugg[reedy] def defc[ompile] 
defe[r] delc[ommand] delf[unction] di[splay] dif[fupdate] diffg[et] diffo[ff] 
diffp[atch] diffpu[t] diffs[plit] difft[his] dig[raphs] disa[ssemble] dj[ump] 
dli[st] dr[op] ds[earch] dsp[lit] e[dit] ea[rlier] echoe[rr] echom[sg] 
echoc[onsole] echon echow[indow] el[se] elsei[f] em[enu] en[dif] endin[terface] 
endc[lass] endd[ef] ende[num] endf[unction] endfo[r] endt[ry] endw[hile] ene[w] 
enu[m] ev[al] ex exi[t] exp[ort] exu[sage] f[ile] files filet[ype] filt[er] 
fin[d] fina[l] finall[y] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] 
foldd[oopen]
-syn keyword vimCommand contained folddoc[losed] foldo[pen] for fu[nction] 
g[lobal] go[to] gr[ep] grepa[dd] gu[i] gv[im] h[elp] helpc[lose] helpf[ind] 
helpg[rep] helpt[ags] ha[rdcopy] hi[ghlight] hid[e] his[tory] ho[rizontal] 
iabc[lear] if ij[ump] il[ist] imp[ort] int[ro] inte[rface] is[earch] isp[lit] 
j[oin] ju[mps] k kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] l[ist] 
lN[ext] lNf[ile] la[st] lab[ove] lan[guage] lad[dexpr] laddb[uffer] laddf[ile] 
laf[ter] lat[er] lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lc[d] lch[dir] lcl[ose] 
lcs[cope] ld[o] le[ft] lefta[bove] let lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] 
lg[etfile] lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lh[elpgrep] lhi[story] ll 
lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loadk[eymap] 
loc[kmarks]
-syn keyword vimCommand contained lockv[ar] lol[der] lop[en] lp[revious] 
lpf[ile] lr[ewind] lt[ag] lua luad[o] luaf[ile] lv[imgrep] lvimgrepa[dd] 
lw[indow] ls m[ove] ma[rk] mak[e] marks mat[ch] menut[ranslate] mes[sages] 
mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] mz[scheme] mzf[ile] 
n[ext] nb[key] nbc[lose] nbs[tart] noa[utocmd] noh[lsearch] nos[wapfile] 
nu[mber] o[pen] ol[dfiles] on[ly] opt[ions] ow[nsyntax] p[rint] pa[ckadd] 
packl[oadall] pc[lose] pe[rl] perld[o] ped[it] po[p] popu[p] pp[op] pre[serve] 
prev[ious] pro[mptfind] promptr[epl] prof[ile] profd[el] ps[earch] pt[ag] 
ptN[ext] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptp[revious] ptr[ewind] 
pts[elect] pu[t] pub[lic] pw[d] py[thon] pyd[o] pyf[ile] py3 py3d[o] python3 
py3f[ile] pyx pyxd[o] pythonx
-syn keyword vimCommand contained pyxf[ile] q[uit] quita[ll] qa[ll] r[ead] 
rec[over] red[o] redi[r] redr[aw] redraws[tatus] redrawt[abline] reg[isters] 
res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] ru[ntime] rub[y] 
rubyd[o] rubyf[ile] rund[o] rv[iminfo] sN[ext] sa[rgument] sal[l] san[dbox] 
sav[eas] sb[uffer] sbN[ext] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] 
sbp[revious] sbr[ewind] sc[riptnames] scripte[ncoding] scriptv[ersion] 
scs[cope] setf[iletype] sf[ind] sfir[st] sh[ell] si[malt] sig[n] sil[ent] 
sl[eep] sla[st] sn[ext] so[urce] sor[t] sp[lit] spe[llgood] spelld[ump] 
spelli[nfo] spellr[epall] spellra[re] spellu[ndo] spellw[rong] spr[evious] 
sr[ewind] st[op] sta[g] star[tinsert] startg[replace] startr[eplace] stat[ic] 
stopi[nsert] stj[ump] sts[elect]
-syn keyword vimCommand contained sun[hide] sus[pend] sv[iew] sw[apname] 
synti[me] sync[bind] smi[le] t tN[ext] ta[g] tags tab tabc[lose] tabd[o] 
tabe[dit] tabf[ind] tabfir[st] tabm[ove] tabl[ast] tabn[ext] tabnew tabo[nly] 
tabp[revious] tabN[ext] tabr[ewind] tabs tc[d] tch[dir] tcl tcld[o] tclf[ile] 
te[aroff] ter[minal] tf[irst] th[row] thi[s] tj[ump] tl[ast] tm[enu] tn[ext] 
to[pleft] tp[revious] tr[ewind] try ts[elect] tu[nmenu] ty[pe] u[ndo] 
undoj[oin] undol[ist] unh[ide] unl[et] unlo[ckvar] uns[ilent] up[date] 
v[global] ve[rsion] verb[ose] vert[ical] vi[sual] vie[w] vim[grep] vimgrepa[dd] 
vim9[cmd] vim9s[cript] viu[sage] vne[w] vs[plit] w[rite] wN[ext] wa[ll] wh[ile] 
wi[nsize] winc[md] wind[o] winp[os] wn[ext] wp[revious] wq wqa[ll] wu[ndo] 
wv[iminfo] x[it]
-syn keyword vimCommand contained xa[ll] xr[estore] y[ank] z dl dell delel 
deletl deletel dp dep delp delep deletp deletep a i
-syn keyword vimCommand contained am[enu] an[oremenu] aun[menu] cme[nu] 
cnoreme[nu] cunme[nu] ime[nu] inoreme[nu] iunme[nu] me[nu] nme[nu] nnoreme[nu] 
noreme[nu] nunme[nu] ome[nu] onoreme[nu] ounme[nu] sme[nu] snoreme[nu] 
sunme[nu] tlm[enu] tln[oremenu] tlu[nmenu] unme[nu] vme[nu] vnoreme[nu] 
vunme[nu] xme[nu] xnoreme[nu] xunme[nu]
-syn keyword vimCommand contained cm[ap] cno[remap] im[ap] ino[remap] lm[ap] 
ln[oremap] nm[ap] nn[oremap] no[remap] om[ap] ono[remap] smap snor[emap] tma[p] 
tno[remap] vm[ap] vn[oremap] xm[ap] xn[oremap]
-syn keyword vimCommand contained cmapc[lear] imapc[lear] lmapc[lear] 
nmapc[lear] omapc[lear] smapc[lear] tmapc[lear] vmapc[lear] xmapc[lear]
-syn keyword vimCommand contained cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] 
sunm[ap] tunma[p] unm[ap] vu[nmap] xu[nmap]
+syn keyword vimCommand contained com[mand] comc[lear] comp[iler] con[tinue] 
conf[irm] cons[t] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] 
cst[ag] cw[indow] d[elete] delm[arks] deb[ug] debugg[reedy] def defc[ompile] 
defe[r] delc[ommand] delf[unction] di[splay] dif[fupdate] diffg[et] diffo[ff] 
diffp[atch] diffpu[t] diffs[plit] difft[his] dig[raphs] disa[ssemble] dj[ump] 
dli[st] dr[op] ds[earch] dsp[lit] e[dit] ea[rlier] el[se] elsei[f] em[enu] 
en[dif] endin[terface] endc[lass] endd[ef] ende[num] endf[unction] endfo[r] 
endt[ry] endw[hile] ene[w] enu[m] ev[al] ex exi[t] exp[ort] exu[sage] f[ile] 
files filet[ype] filt[er] fin[d] fina[l] finall[y] fini[sh] fir[st] fix[del] 
fo[ld] foldc[lose] foldd[oopen] folddoc[losed] foldo[pen] for fu[nction] 
g[lobal]
+syn keyword vimCommand contained go[to] gr[ep] grepa[dd] gu[i] gv[im] h[elp] 
helpc[lose] helpf[ind] helpg[rep] helpt[ags] ha[rdcopy] hi[ghlight] hid[e] 
his[tory] ho[rizontal] iabc[lear] if ij[ump] il[ist] imp[ort] int[ro] 
inte[rface] is[earch] isp[lit] j[oin] ju[mps] k kee[pmarks] keepj[umps] 
keepp[atterns] keepa[lt] l[ist] lN[ext] lNf[ile] la[st] lab[ove] lan[guage] 
lad[dexpr] laddb[uffer] laddf[ile] laf[ter] lat[er] lb[uffer] lbe[fore] 
lbel[ow] lbo[ttom] lc[d] lch[dir] lcl[ose] lcs[cope] ld[o] le[ft] lefta[bove] 
let lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] 
lgr[ep] lgrepa[dd] lh[elpgrep] lhi[story] ll lla[st] lli[st] lmak[e] lne[xt] 
lnew[er] lnf[ile] lo[adview] loadk[eymap] loc[kmarks] lockv[ar] lol[der] 
lop[en] lp[revious]
+syn keyword vimCommand contained lpf[ile] lr[ewind] lt[ag] lua luad[o] 
luaf[ile] lv[imgrep] lvimgrepa[dd] lw[indow] ls m[ove] ma[rk] mak[e] marks 
mat[ch] menut[ranslate] mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] 
mkvie[w] mod[e] mz[scheme] mzf[ile] n[ext] nb[key] nbc[lose] nbs[tart] 
noa[utocmd] noh[lsearch] nos[wapfile] nu[mber] o[pen] ol[dfiles] on[ly] 
opt[ions] ow[nsyntax] p[rint] pa[ckadd] packl[oadall] pc[lose] pe[rl] perld[o] 
ped[it] po[p] popu[p] pp[op] pre[serve] prev[ious] pro[mptfind] promptr[epl] 
prof[ile] profd[el] ps[earch] pt[ag] ptN[ext] ptf[irst] ptj[ump] ptl[ast] 
ptn[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pub[lic] pw[d] py[thon] 
pyd[o] pyf[ile] py3 py3d[o] python3 py3f[ile] pyx pyxd[o] pythonx pyxf[ile] 
q[uit] quita[ll] qa[ll] r[ead]
+syn keyword vimCommand contained rec[over] red[o] redi[r] redr[aw] 
redraws[tatus] redrawt[abline] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] 
ri[ght] rightb[elow] ru[ntime] rub[y] rubyd[o] rubyf[ile] rund[o] rv[iminfo] 
sN[ext] sa[rgument] sal[l] san[dbox] sav[eas] sb[uffer] sbN[ext] sba[ll] 
sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbp[revious] sbr[ewind] sc[riptnames] 
scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] sf[ind] sfir[st] 
sh[ell] si[malt] sig[n] sil[ent] sl[eep] sla[st] sn[ext] so[urce] sor[t] 
sp[lit] spe[llgood] spelld[ump] spelli[nfo] spellr[epall] spellra[re] 
spellu[ndo] spellw[rong] spr[evious] sr[ewind] st[op] sta[g] star[tinsert] 
startg[replace] startr[eplace] stat[ic] stopi[nsert] stj[ump] sts[elect] 
sun[hide] sus[pend] sv[iew] sw[apname]
+syn keyword vimCommand contained synti[me] sync[bind] smi[le] t tN[ext] ta[g] 
tags tab tabc[lose] tabd[o] tabe[dit] tabf[ind] tabfir[st] tabm[ove] tabl[ast] 
tabn[ext] tabnew tabo[nly] tabp[revious] tabN[ext] tabr[ewind] tabs tc[d] 
tch[dir] tcl tcld[o] tclf[ile] te[aroff] ter[minal] tf[irst] th[row] thi[s] 
tj[ump] tl[ast] tm[enu] tn[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] 
tu[nmenu] ty[pe] u[ndo] undoj[oin] undol[ist] unh[ide] unl[et] unlo[ckvar] 
uns[ilent] up[date] v[global] ve[rsion] verb[ose] vert[ical] vi[sual] vie[w] 
vim[grep] vimgrepa[dd] vim9[cmd] vim9s[cript] viu[sage] vne[w] vs[plit] w[rite] 
wN[ext] wa[ll] wh[ile] wi[nsize] winc[md] wind[o] winp[os] wn[ext] wp[revious] 
wq wqa[ll] wu[ndo] wv[iminfo] x[it] xa[ll] xr[estore] y[ank] z dl dell delel
+syn keyword vimCommand contained deletl deletel dp dep delp delep deletp 
deletep a i
 
 syn keyword vimCommand contained       2mat[ch] 3mat[ch]
 
@@ -218,6 +214,8 @@ syn match vimVar            "\s\zs&t_k;"
 syn match vimFBVar      contained   "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
 syn keyword vimCommand  contained      in
 
+syn cluster vimExprList 
contains=vimEnvvar,vimFunc,vimFuncVar,vimNumber,vimOper,vimOperParen,vimLetRegister,vimString,vimVar
+
 " Insertions And Appends: insert append {{{2
 "   (buftype != nofile test avoids having append, change, insert show up in 
the command window)
 " =======================
@@ -387,11 +385,11 @@ syn match vimEscape       contained       
"\\o\{1,3}\|\[xX]\x\{1,2}\|\u\x\{1,4}\|\U\x\{1
 syn match      vimEscape       contained       "\<" contains=vimNotation
 syn match      vimEscape       contained       "\<\*[^>]*>\=>"
 
-syn region     vimString start=+$'+ end=+'+ skip=+''+ oneline 
contains=vimStringInterpolationBrace,vimStringInterpolationExpr
-syn region     vimString start=+$"+ end=+"+ oneline 
contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
-syn region     vimStringInterpolationExpr matchgroup=vimSep start=+{+ end=+}+ 
oneline 
contains=vimFunc,vimFuncVar,vimOper,vimOperParen,vimNotation,vimNumber,vimString,vimVar
-syn match      vimStringInterpolationBrace "{{"
-syn match      vimStringInterpolationBrace "}}"
+syn region     vimString       oneline start=+$'+ skip=+''+ end=+'+ 
contains=vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region     vimString       oneline start=+$"+ end=+"+ 
contains=@vimStringGroup,vimStringInterpolationBrace,vimStringInterpolationExpr
+syn region     vimStringInterpolationExpr  oneline contained matchgroup=vimSep 
start=+{+ end=+}+ contains=@vimExprList
+syn match      vimStringInterpolationBrace contained "{{"
+syn match      vimStringInterpolationBrace contained "}}"
 
 " Substitutions: {{{2
 " =============
@@ -486,13 +484,17 @@ syn match vimAutoCmdMod   "\(++\)\=\(once\|nested\)"
 
 " Echo And Execute: -- prefer strings! {{{2
 " ================
-syn region     vimEcho oneline excludenl matchgroup=vimCommand 
start="\<ec\%[ho]\>" skip="\(\\\)*\|" end="$\||" 
contains=vimFunc,vimFuncVar,vimString,vimVar
-syn region     vimExecute      oneline excludenl matchgroup=vimCommand 
start="\<exe\%[cute]\>" skip="\(\\\)*\|" end="$\||\|<[cC][rR]>" 
contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
-syn match      vimEchoHL       "echohl\="      skipwhite 
nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
+" GEN_SYN_VIM: vimCommand echo, START_STR='syn keyword vimEcho', 
END_STR='skipwhite nextgroup=vimEchoExpr'
+syn keyword vimEcho ec[ho] echoe[rr] echom[sg] echoc[onsole] echon 
echow[indow] skipwhite nextgroup=vimEchoExpr
+syn region     vimEchoExpr     contained       start="[^[:space:]|]" 
skip=+\\\|\|\|
\s*\\|
\s*"\ + matchgroup=vimCmdSep end="|" end="$" contains=@vimContinue,@vimExprList
+
+syn match      vimEchoHL       "\<echohl\=\>"  skipwhite 
nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
 syn case ignore
 syn keyword    vimEchoHLNone   none
 syn case match
 
+syn region     vimExecute      oneline excludenl matchgroup=vimCommand 
start="\<exe\%[cute]\>" skip="\(\\\)*\|" end="$\||\|<[cC][rR]>" 
contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
+
 " Maps: {{{2
 " ====
 syn match      vimMap          "\<map\>\ze\s*(\@!"         skipwhite 
nextgroup=vimMapMod,vimMapLhs
@@ -997,6 +999,7 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimContinue       Special
  hi def link vimContinueComment        vimComment
  hi def link vimCtrlChar       SpecialChar
+ hi def link vimEcho   vimCommand
  hi def link vimEchoHLNone     vimGroup
  hi def link vimEchoHL vimCommand
  hi def link vimElseIfErr      Error

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rf2gN-0057Eo-A1%40256bit.org.

Raspunde prin e-mail lui