runtime(vim): Update base-syntax, improve :command highlighting
- Match multiline :command definitions.
- Match custom completion funcref var names.
fixes: #17001
closes: #17067
Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/generator/gen_syntax_vim.vim b/runtime/syntax/generator/gen_syntax_vim.vim
index 19e5491..b858079 100644
--- a/runtime/syntax/generator/gen_syntax_vim.vim
+++ b/runtime/syntax/generator/gen_syntax_vim.vim
@@ -1,7 +1,7 @@
" Vim syntax file generator
" Language: Vim script
" Maintainer: Hirohito Higashi (h_east)
-" Last Change: 2025 Mar 09
+" Last Change: 2025 Apr 06
let s:keepcpo= &cpo
set cpo&vim
@@ -734,9 +734,9 @@
let lnum = s:search_and_check('vimVarName', base_fname, str_info)
let lnum = s:append_syn_any(lnum, str_info, li)
- " vimUserAttrbCmplt
+ " vimUserAttrComplete
let li = a:vim_info.compl_name
- let lnum = s:search_and_check('vimUserCmdAttrCmplt', base_fname, str_info)
+ let lnum = s:search_and_check('vimUserCmdAttrComplete', base_fname, str_info)
let lnum = s:append_syn_any(lnum, str_info, li)
" vimUserAttrbAddr
diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base
index 83a61c9..d13d1f0 100644
--- a/runtime/syntax/generator/vim.vim.base
+++ b/runtime/syntax/generator/vim.vim.base
@@ -2,7 +2,7 @@
" Language: Vim script
" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
" Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2025 Apr 05
+" Last Change: 2025 Apr 06
" Former Maintainer: Charles E. Campbell
" DO NOT CHANGE DIRECTLY.
@@ -614,22 +614,30 @@
" User-Specified Commands: {{{2
" =======================
syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
-syn keyword vimUserCmdKey contained com[mand]
-syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock
-syn match vimUserCmd "\<com\%[mand]\>!\=.*$" contains=vimUserCmdKey,vimBang,vimUserCmdAttr,vimUserCmdAttrError,vimUserCmdName,@vimUserCmdList,vimComFilter
-syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)"
-syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
-syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrCmplt,vimUserCmdError
-syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber
-syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
-syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
-syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey
+
+syn match vimUserCmd "\<com\%[mand]\>!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang
+syn match vimUserCmd +\<com\%[mand]\>!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang
+
+syn region vimUserCmdAttrs contained
+ \ start="-\l"
+ \ start=+^\s*\%(\\\|["#]\\ \)+
+ \ end="\ze\s\u"
+ \ skipwhite nextgroup=vimUserCmdName
+ \ contains=@vimContinue,vimUserCmdAttr,vimUserCmdAttrError
+ \ transparent
+syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)"
+syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
+syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError
+syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber
+syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
+syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
+syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey
syn match vimUserCmdAttrNargs contained "[01*?+]"
syn match vimUserCmdAttrRange contained "%"
@@ -640,17 +648,34 @@
syn case ignore
syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister]
-" GEN_SYN_VIM: vimUserCmdAttrCmplt, START_STR='syn keyword vimUserCmdAttrCmplt contained', END_STR=''
-syn keyword vimUserCmdAttrCmplt contained custom customlist nextgroup=vimUserCmdAttrCmpltFunc,vimUserCmdError
-syn match vimUserCmdAttrCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
+
+" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR=''
+syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var
+syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError
+syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFuncSID
+
" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR=''
-syn match vimUserCmdAttrAddr contained "?"
+syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win
+syn match vimUserCmdAttrAddr contained "?"
syn case match
-syn region vimUserCmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList
+syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement
+syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement
+syn region vimUserCmdReplacement contained
+ \ start="\S"
+ \ start=+^\s*\%(\\\|["#]\\ \)+
+ \ skip=+\n\s*\%(\\\|["#]\\ \)+
+ \ end="$"
+ \ contains=@vimContinue,@vimUserCmdList,vimComFilter
+syn region vimUserCmdBlock contained
+ \ matchgroup=vimSep
+ \ start="{"
+ \ end="^\s*\zs}"
+ \ contains=@vimDefBodyList
-syn match vimDelcommand "\<delc\%[ommand]\>" skipwhite nextgroup=vimDelcommandAttr
-syn match vimDelcommandAttr contained "-buffer\>"
+syn match vimDelcommand "\<delc\%[ommand]\>" skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName
+syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName
+syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>"
" Lower Priority Comments: after some vim commands... {{{2
" =======================
@@ -1729,8 +1754,10 @@
hi def link vimUnlet vimCommand
hi def link vimUnletBang vimBang
hi def link vimUnmap vimMap
+ hi def link vimUserCmd vimCommand
hi def link vimUserCmdAttrAddr vimSpecial
- hi def link vimUserCmdAttrCmplt vimSpecial
+ hi def link vimUserCmdAttrComplete vimSpecial
+ hi def link vimUserCmdAttrCompleteFunc vimVar
hi def link vimUserCmdAttrNargs vimSpecial
hi def link vimUserCmdAttrRange vimSpecial
hi def link vimUserCmdAttrKey vimUserCmdAttr
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_00.dump b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
index b932641..e782ad0 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
@@ -1,20 +1,20 @@
>"+0#0000e05#ffffff0| |V|i|m| |:|c|o|m@1|a|n|d|,| |:|d|e|l|c|o|m@1|a|n|d| |a|n|d| |:|c|o|m|c|l|e|a|r| |c|o|m@1|a|n|d|s| +0#0000000&@24
+|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |v|i|m|U|s|e|r|C|m|d|N|a|m|e| |T|o|d|o| +0#0000000&@23
+|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |v|i|m|D|e|l|c|o|m@1|a|n|d|N|a|m|e| |T|o|d|o| +0#0000000&@20
@75
@75
|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
@75
|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@67
-|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|F| @65
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012| +0#0000000#ffffff0@65
+@75
@75
|"+0#0000e05&| |d|e|f|i|n|e| +0#0000000&@66
@75
-|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@1|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@38
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@1|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
@75
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@60
-@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@62
-@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62
-@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@62
-|}+0#e000e06&| +0#0000000&@73
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@38
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|{+0#e000e06&| +0#0000000&@60
@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_01.dump b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump
index 347a4f7..a653a4d 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0@74
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@60
+|c+0#af5f00255#ffffff0|o|m@1|a|n|d| +0#0000000&@1|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@38
+@75
+>c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|{+0#e000e06&| +0#0000000&@60
@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@62
@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62
@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@62
->}+0#e000e06&| +0#0000000&@73
+|}+0#e000e06&| +0#0000000&@73
@75
|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1
-|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F|o@1| @35
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@24
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@35
@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56
@75
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|,+0#0000000&|C|o|m|p|l|e|t|e|r|1| |F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|C|o|m|p|l|e|t|e|r|2| |F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@19
-@75
-|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
-@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|f|u|n|c|t|i|o|n|)|"| +0#0000000&@26
-|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
-@75
-|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64
-@57|1|9|,|1| @9|2|3|%|
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|@+0#4040ff13&@2
+| +0#0000000&@56|1|9|,|1| @9|1|0|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_02.dump b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump
index 00a8298..9909f2f 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_02.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump
@@ -1,20 +1,20 @@
-|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64
-@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|d|e|f|)|"| +0#0000000&@31
-|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@39
+@6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56
@75
-|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |d|e|f|i|n|e| +0#0000000&@56
-> @74
-|"+0#0000e05&| |c|o|m@1|a|n|d|!| +0#0000000&@64
-|"+0#0000e05&| @6|\| |-|a|d@1|r|=|l|i|n|e|s| +0#0000000&@53
-|"+0#0000e05&| @6|\| |-|b|a|n|g| +0#0000000&@59
-|"+0#0000e05&| @6|\| |-|b|a|r| +0#0000000&@60
-|"+0#0000e05&| @6|\| |-|b|u|f@1|e|r| +0#0000000&@57
-|"+0#0000e05&| @6|\| |-|c|o|m|p|l|e|t|e|=|b|u|f@1|e|r| +0#0000000&@48
-|"+0#0000e05&| @6|\| |-|c|o|u|n|t| +0#0000000&@58
-|"+0#0000e05&| @6|\| |-|n|a|r|g|s|=|*| +0#0000000&@56
-|"+0#0000e05&| @6|\| |-|r|a|n|g|e| +0#0000000&@58
-|"+0#0000e05&| @6|\| |-|r|e|g|i|s|t|e|r| +0#0000000&@55
-|"+0#0000e05&| @6|\| |-|k|e@1|p|s|c|r|i|p|t| +0#0000000&@53
-|"+0#0000e05&| @6|\| |F|o@1| | +0#0000000&@60
-|"+0#0000e05&| @6|\| |e|c|h|o| |"+0#e000002&|F|O@1|"| +0#0000000&@54
-@57|3|6|,|0|-|1| @7|5|4|%|
+>c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@35
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| +0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| +0#0000000&|-+0#e000e06&|k|e@1
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@39
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|1| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@21
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|2| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@17
+@57|3|4|,|1| @9|2@1|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_03.dump b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump
index 0fe7a38..c035fb6 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_03.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump
@@ -1,20 +1,20 @@
-|"+0#0000e05#ffffff0| @6|\| |e|c|h|o| |"+0#e000002&|F|O@1|"| +0#0000000&@54
+|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|s+0#00e0e07&|:|C|o|m|p|l|e|t|e|r|2| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@17
@75
-|"+0#0000e05&| |e|r@1|o|r|s| +0#0000000&@66
-@75
-|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#af5f00255#ffffff0|a+0#00e0e07&|r|g|u|m|e|n|t|s| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|f|u|n|c|t|i|o|n|)|"| +0#0000000&@26
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
> @74
-|"+0#0000e05&| |d|e|l|e|t|e| +0#0000000&@66
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64
+@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|d|e|f|)|"| +0#0000000&@31
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
@75
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| @60
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F|o@1| @52
@75
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@47
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@39
+|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |d|e|f|i|n|e| +0#0000000&@56
@75
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@50
-|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42
-@75
-|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@66
-|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-@57|5|4|,|0|-|1| @7|8|7|%|
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|a|d@1|r|=|l+0#00e0003&|i|n|e|s| +0#0000000&@54
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&@62
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60
+@57|5|0|,|0|-|1| @7|3|5|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_04.dump b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump
index 9700fc3..a263a18 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_04.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump
@@ -1,20 +1,20 @@
-|c+0#af5f00255#ffffff0|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@53
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55
+@6>\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56
@75
-@75
-|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| +0#0000000&@60
-> @74
-|c+0#af5f00255&|o|m| +0#0000000&|F|o@1| |c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#e000e06&|'+0#e000002&|l|s|'|)+0#e000e06&| +0#0000000&@49
-@75
-|~+0#4040ff13&| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-| +0#0000000&@56|7|2|,|0|-|1| @7|B|o|t|
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&@66
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|a|d@1|r|=|l+0#00e0003&|i|n|e|s| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&@61
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&@62
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&@59
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57
+@57|6|8|,|7| @9|4|9|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_05.dump b/runtime/syntax/testdir/dumps/vim_ex_command_05.dump
new file mode 100644
index 0000000..7b78054
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56
+> @74
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&@66
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|a|d@1|r|=|l+0#00e0003&|i|n|e|s| +0#0000000&@55
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&@61
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|a|r| +0#0000000&@62
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&@59
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|b+0#00e0003&|u|f@1|e|r| +0#0000000&@50
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|c|o|u|n|t| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@57|8|6|,|0|-|1| @7|6|4|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_06.dump b/runtime/syntax/testdir/dumps/vim_ex_command_06.dump
new file mode 100644
index 0000000..4e9926f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_06.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@5|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&@58
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|a|n|g|e| +0#0000000&@60
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6>\+0#e000e06&| +0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&@57
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|-+0#e000e06&|k|e@1|p|s|c|r|i|p|t| +0#0000000&@55
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@63
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| @54
+@6|"+0#0000e05&|\| |c|o|m@1|e|n|t| +0#0000000&@58
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@56
+@75
+@75
+|"+0#0000e05&| |e|r@1|o|r|s| +0#0000000&@66
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#0000000#ffffff0|a|r|g|u|m|e|n|t|s| |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8
+@57|1|0|4|,|7| @8|7|8|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_07.dump b/runtime/syntax/testdir/dumps/vim_ex_command_07.dump
new file mode 100644
index 0000000..3d51e30
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_07.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|o|m@1|a|n|d|!| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#0000000#ffffff0|a|r|g|u|m|e|n|t|s| |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| +0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8
+@75
+@75
+|"+0#0000e05&| |d|e|l|e|t|e| +0#0000000&@66
+@75
+>d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@60
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0@52
+@75
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@47
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@39
+@75
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@50
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42
+@75
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@66
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@53
+@75
+@75
+@57|1|2@1|,|1| @8|9|2|%|
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_08.dump b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump
new file mode 100644
index 0000000..19a6c36
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_08.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| |(|v|i|m|.|v|i|m| |s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n|g| |b|r|o|k|e|n| |w|r|t| |s|y|s|t|e|m|(|)@1| +0#0000000&@10
+@75
+|c+0#af5f00255&|o|m| +0#0000000&|F+0#0000001#ffff4012|o@1| +0#0000000#ffffff0|c+0#af5f00255&|a|l@1| +0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#e000e06&|'+0#e000002&|l|s|'|)+0#e000e06&| +0#0000000&@49
+@75
+> @74
+|"+0#0000e05&| |I|s@1|u|e| |#|1|7|0@1|1| |(|W|r|o|n|g| |v|i|m|U|s|e|r|C|m|d|A|t@1|r|E|r@1|o|r| |h|i|g|h|l|i|g|h|t|i|n|g| |i|n| |v|i|m|.|v|i|m|)| +0#0000000&@8
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|f+0#00e0003&|i|l|e| +0#0000000&|M+0#0000001#ffff4012|a|k|e| +0#0000000#ffffff0|A|s|y|n|c|R|u|n| |-+0#af5f00255&|p+0#00e0e07&|r|o|g|r|a|m|=+0#af5f00255&|m+0#00e0e07&|a|k|e| +0#0000000&|@| |<+0#e000e06&|a|r|g|s|>
+| +0#0000000&@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|4|0|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/input/vim_ex_command.vim b/runtime/syntax/testdir/input/vim_ex_command.vim
index 0873648..4679b08 100644
--- a/runtime/syntax/testdir/input/vim_ex_command.vim
+++ b/runtime/syntax/testdir/input/vim_ex_command.vim
@@ -1,4 +1,6 @@
" Vim :command, :delcommand and :comclear commands
+" VIM_TEST_SETUP highlight link vimUserCmdName Todo
+" VIM_TEST_SETUP highlight link vimDelcommandName Todo
" list
@@ -6,10 +8,12 @@
command
command F
+
" define
command Foo echo "Foo"
command! Foo echo "Foo"
+
command! Foo echo "Foo" | echo "Bar"
command! Foo {
@@ -18,11 +22,27 @@
echo "Baz"
}
+command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register Foo echo "Foo"
+
command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register Foo
\ echo "Foo"
-command! -complete=custom,Completer1 Foo echo "Foo"
-command! -complete=customlist,Completer2 Foo echo "Foo"
+command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register
+ \ Foo
+ \ echo "Foo"
+
+command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register Foo
+ "\ comment
+ \ echo "Foo"
+
+command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 -keepscript -nargs=* -range=% -register
+ "\ comment
+ \ Foo
+ "\ comment
+ \ echo "Foo"
+
+command! -complete=custom,s:Completer1 Foo echo "Foo"
+command! -complete=customlist,s:Completer2 Foo echo "Foo"
function Foo()
command! Foo echo "Foo (defined in :function)"
@@ -32,43 +52,93 @@
command! Foo echo "Foo (defined in :def)"
enddef
+
" multiline define
-" command!
-" \ -addr=lines
-" \ -bang
-" \ -bar
-" \ -buffer
-" \ -complete=buffer
-" \ -count
-" \ -nargs=*
-" \ -range
-" \ -register
-" \ -keepscript
-" \ Foo
-" \ echo "FOO"
+command! -addr=lines
+ \ -bang
+ \ -bar
+ \ -buffer
+ \ -complete=buffer
+ \ -count
+ \ -nargs=*
+ \ -range
+ \ -register
+ \ -keepscript
+ \ Foo
+ \ echo "Foo" |
+ \ echo "Bar"
+
+command!
+ \ -addr=lines
+ \ -bang
+ \ -bar
+ \ -buffer
+ \ -complete=buffer
+ \ -count
+ \ -nargs=*
+ \ -range
+ \ -register
+ \ -keepscript
+ \ Foo
+ \ echo "Foo" |
+ \ echo "Bar"
+
+command!
+ "\ comment
+ \ -addr=lines
+ \ -bang
+ "\ comment
+ "\ comment
+ \ -bar
+ \ -buffer
+ "\ comment
+ \ -complete=buffer
+ "\ comment
+ \ -count
+ "\ comment
+ \ -nargs=*
+ "\ comment
+ \ -range
+ "\ comment
+ \ -register
+ "\ comment
+ \ -keepscript
+ "\ comment
+ \ Foo
+ "\ comment
+ \ echo "Foo" |
+ "\ comment
+ \ echo "Bar"
+
" errors
command! -badattr=arguments -bang -badattr -nargs=* Foo echo "Foo"
+
" delete
delcommand Foo
delcommand -buffer Foo
-delcommand Foo | echo "..."
-delcommand -buffer Foo | echo "..."
+delcommand Foo | echo "Foo"
+delcommand -buffer Foo | echo "Foo"
delcommand Foo " comment
delcommand -buffer Foo " comment
comclear
comclear " comment
-comclear | echo "..."
+comclear | echo "Foo"
-" Issue #14135
+" Issue #14135 (vim.vim syntax highlighting broken wrt system())
com Foo call system('ls')
+
+" Issue #17001 (Wrong vimUserCmdAttrError highlighting in vim.vim)
+
+command! -bang -nargs=* -complete=file Make AsyncRun -program=make @ <args>
+
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index dcdb6bc..07c3250 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -664,22 +664,30 @@
" User-Specified Commands: {{{2
" =======================
syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
-syn keyword vimUserCmdKey contained com[mand]
-syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock
-syn match vimUserCmd "\<com\%[mand]\>!\=.*$" contains=vimUserCmdKey,vimBang,vimUserCmdAttr,vimUserCmdAttrError,vimUserCmdName,@vimUserCmdList,vimComFilter
-syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)"
-syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
-syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrCmplt,vimUserCmdError
-syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber
-syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
-syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey
-syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
-syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey
+
+syn match vimUserCmd "\<com\%[mand]\>!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang
+syn match vimUserCmd +\<com\%[mand]\>!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang
+
+syn region vimUserCmdAttrs contained
+ \ start="-\l"
+ \ start=+^\s*\%(\\\|["#]\\ \)+
+ \ end="\ze\s\u"
+ \ skipwhite nextgroup=vimUserCmdName
+ \ contains=@vimContinue,vimUserCmdAttr,vimUserCmdAttrError
+ \ transparent
+syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)"
+syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
+syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrComplete,vimUserCmdError
+syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber
+syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
+syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey
+syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
+syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey
syn match vimUserCmdAttrNargs contained "[01*?+]"
syn match vimUserCmdAttrRange contained "%"
@@ -690,19 +698,36 @@
syn case ignore
syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister]
-" GEN_SYN_VIM: vimUserCmdAttrCmplt, START_STR='syn keyword vimUserCmdAttrCmplt contained', END_STR=''
-syn keyword vimUserCmdAttrCmplt contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var
-syn keyword vimUserCmdAttrCmplt contained custom customlist nextgroup=vimUserCmdAttrCmpltFunc,vimUserCmdError
-syn match vimUserCmdAttrCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
+
+" GEN_SYN_VIM: vimUserCmdAttrComplete, START_STR='syn keyword vimUserCmdAttrComplete contained', END_STR=''
+syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var
+syn keyword vimUserCmdAttrComplete contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd shellcmdline sign syntax syntime tag tag_listfiles user var
+syn keyword vimUserCmdAttrComplete contained custom customlist nextgroup=vimUserCmdAttrCompleteFunc,vimUserCmdError
+syn match vimUserCmdAttrCompleteFunc contained ",\%([bwglstav]:\|<[sS][iI][dD]>\)\=\h\w*\%([.#]\h\w*\)*"hs=s+1 nextgroup=vimUserCmdError contains=vimVarScope,vimFuncSID
+
" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR=''
syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win
-syn match vimUserCmdAttrAddr contained "?"
+syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win
+syn match vimUserCmdAttrAddr contained "?"
syn case match
-syn region vimUserCmdBlock contained matchgroup=vimSep start="{" end="^\s*\zs}" contains=@vimDefBodyList
+syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock,vimUserCmdReplacement
+syn match vimUserCmdName contained +\<\u[[:alnum:]]*\>\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdBlock,vimUserCmdReplacement
+syn region vimUserCmdReplacement contained
+ \ start="\S"
+ \ start=+^\s*\%(\\\|["#]\\ \)+
+ \ skip=+\n\s*\%(\\\|["#]\\ \)+
+ \ end="$"
+ \ contains=@vimContinue,@vimUserCmdList,vimComFilter
+syn region vimUserCmdBlock contained
+ \ matchgroup=vimSep
+ \ start="{"
+ \ end="^\s*\zs}"
+ \ contains=@vimDefBodyList
-syn match vimDelcommand "\<delc\%[ommand]\>" skipwhite nextgroup=vimDelcommandAttr
-syn match vimDelcommandAttr contained "-buffer\>"
+syn match vimDelcommand "\<delc\%[ommand]\>" skipwhite nextgroup=vimDelcommandAttr,vimDelcommandName
+syn match vimDelcommandAttr contained "-buffer\>" skipwhite nextgroup=vimDelcommandName
+syn match vimDelcommandName contained "\<\u[[:alnum:]]*\>"
" Lower Priority Comments: after some vim commands... {{{2
" =======================
@@ -1787,8 +1812,10 @@
hi def link vimUnlet vimCommand
hi def link vimUnletBang vimBang
hi def link vimUnmap vimMap
+ hi def link vimUserCmd vimCommand
hi def link vimUserCmdAttrAddr vimSpecial
- hi def link vimUserCmdAttrCmplt vimSpecial
+ hi def link vimUserCmdAttrComplete vimSpecial
+ hi def link vimUserCmdAttrCompleteFunc vimVar
hi def link vimUserCmdAttrNargs vimSpecial
hi def link vimUserCmdAttrRange vimSpecial
hi def link vimUserCmdAttrKey vimUserCmdAttr