runtime(vim): Update base-syntax, improve :mark and :substitute highlighting

- Match full :mark and :k commands.
- Match 2 and 3 letter :s repeat commands.
- Match :s [count] argument.

closes: #17408

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 e3317fc..5cafa10 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 May 17
+" Last Change: 2025 May 28
 
 let s:keepcpo= &cpo
 set cpo&vim
@@ -296,6 +296,7 @@
 		import
 		interface
 		insert
+		k
 		let
 		loadkeymap
 		lhelpgrep
@@ -307,6 +308,7 @@
 		luafile
 		map
 		mapclear
+		mark
 		match
 		mzscheme
 		mzfile
diff --git a/runtime/syntax/generator/vim.vim.base b/runtime/syntax/generator/vim.vim.base
index 5b3b826..759bd91 100644
--- a/runtime/syntax/generator/vim.vim.base
+++ b/runtime/syntax/generator/vim.vim.base
@@ -233,7 +233,7 @@
 syn case match
 
 " All vimCommands are contained by vimIsCommand. {{{2
-syn cluster vimCmdList	contains=vimAbb,vimAddress,vimAutocmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDoautocmd,vimDebuggreedy,vimDef,vimDefFold,vimDelcommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimFor,vimFunction,vimFuncFold,vimGrep,vimGrepAdd,vimGlobal,vimHelpgrep,vimHighlight,vimImport,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimThrow,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl
+syn cluster vimCmdList	contains=vimAbb,vimAddress,vimAutocmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDoautocmd,vimDebuggreedy,vimDef,vimDefFold,vimDelcommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimExMark,vimFor,vimFunction,vimFuncFold,vimGrep,vimGrepAdd,vimGlobal,vimHelpgrep,vimHighlight,vimImport,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimThrow,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl
 syn cluster vim9CmdList	contains=vim9Abstract,vim9Class,vim9Const,vim9Enum,vim9Export,vim9Final,vim9For,vim9Interface,vim9Type,vim9Var
 syn match vimCmdSep	"\\\@1<!|"	skipwhite nextgroup=@vimCmdList,vimSubst1,vimFunc
 syn match vimCmdSep	":\+"	skipwhite nextgroup=@vimCmdList,vimSubst1
@@ -846,10 +846,16 @@
 syn cluster	vimSubstList	contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTwoBS,vimSubstRange,vimNotation
 syn cluster	vimSubstRepList	contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
 syn cluster	vimSubstList	add=vimCollection
-syn match	vimSubst	"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>"			skipwhite nextgroup=vimSubstPat
-syn match	vimSubst	"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@="		skipwhite nextgroup=vimSubstPat
-syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@="	skipwhite nextgroup=vimSubstPat
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@="	skipwhite nextgroup=vimSubstCount
+syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount
 syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)[_#]\@="	skipwhite nextgroup=vimSubstPat
+syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\%(\d\+\)\@="	skipwhite nextgroup=vimSubstCount
+syn match	vimSubstFlagErr	contained	"[^< \t\r|]\+" contains=vimSubstFlags
+" & and # after :s are always pattern delimiters not flags
+syn match	vimSubstFlags	contained	"[&cegiIlnpr#]\+"	skipwhite nextgroup=vimSubstCount
+syn match	vimSubstCount	contained	"\d\+\>"
 " TODO: Vim9 illegal separators for abbreviated :s form are [-.:], :su\%[...] required
 "     : # is allowed but "not recommended" (see :h pattern-delimiter)
 syn region	vimSubstPat	contained	matchgroup=vimSubstDelim start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1	contains=@vimSubstList	nextgroup=vimSubstRep4	oneline
@@ -859,13 +865,41 @@
 syn match	vimCollClass	contained 	transparent	"\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
 syn match	vimSubstSubstr	contained	"\\z\=\d"
 syn match	vimSubstTwoBS	contained	"\\\\"
-syn match	vimSubstFlagErr	contained	"[^< \t\r|]\+" contains=vimSubstFlags
-syn match	vimSubstFlags	contained	"[&cegiIlnpr#]\+"
+
+" TODO: flags, unlike count, must follow immediately
+"     : distinguish from with Vim9 &var
+" syn match	vimSubst		"^\s*\zs&&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst		"^\s*\zs\~&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst1	contained	"&&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst1	contained	"\~&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+
+" two and three letter variants (matched as :s + flags, count may follow immediately)
+syn match	vimSubst		"^\s*\zssc[egiIlnp]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssg[ceiIlnpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssi[ceInpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssI[ceginplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssr[cgiInplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+
+syn match	vimSubst1	contained	"\<sc[egiIlnp]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sg[ceiIlnpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<si[ceInpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sI[ceginplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sr[cgiInplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
 
 " Vi compatibility
 syn match	vimSubstDelim	contained	"\\"
 syn match	vimSubstPat	contained	"\\\ze[/?&]" contains=vimSubstDelim nextgroup=vimSubstRep4
 
+" Mark: {{{2
+" ====
+VimL syn match	vimExMark	"\<k\%([a-zA-Z0-9]\>\|[[\]<>'`]\)\@="         nextgroup=@vimMarkArg
+VimL syn match	vimExMark	"\<k\>"	      	skipwhite nextgroup=@vimMarkArg
+syn match	vimExMark	"\<mark\>"	      	skipwhite nextgroup=@vimMarkArg
+
+syn match	vimMarkArg	contained	"[a-zA-Z]\>\|[[\]<>'`]"	skipwhite nextgroup=vimCmdSep,vimComment
+syn match	vimMarkArgError	contained	"["^.(){}0-9]"
+syn cluster	vimMarkArg	contains=vimMarkArg,vimMarkArgError
+
 " Marks, Registers, Addresses, Filters: {{{2
 syn match	vimMark	"'[a-zA-Z0-9]\ze[-+,!]"	nextgroup=vimFilter,vimMarkNumber,vimSubst1
 syn match	vimMark	"'[[\]{}()<>]\ze[-+,!]"	nextgroup=vimFilter,vimMarkNumber,vimSubst1
@@ -1941,6 +1975,7 @@
   hi def link vimHiCtermError	vimError
   hi def link vimHiKeyError	vimError
   hi def link vimMapModErr	vimError
+  hi def link vimMarkArgError	vimError
   hi def link vimShebangError	vimError
   hi def link vimSortOptionsError	Error
   hi def link vimSubstFlagErr	vimError
@@ -2010,6 +2045,7 @@
  hi def link vimEscape	Special
  hi def link vimExFilter	vimCommand
  hi def link vimExFilterBang	vimCommand
+ hi def link vimExMark	vimCommand
  hi def link vimFBVar	vimVar
  hi def link vimFgBgAttrib	vimHiAttrib
  hi def link vimFuncEcho	vimCommand
@@ -2161,6 +2197,7 @@
  hi def link vimStringEnd	vimString
  hi def link vimStringInterpolationBrace	vimEscape
  hi def link vimSubst1	vimSubst
+ hi def link vimSubstCount	Number
  hi def link vimSubstDelim	Delimiter
  hi def link vimSubstFlags	Special
  hi def link vimSubstSubstr	SpecialChar
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_00.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_00.dump
new file mode 100644
index 0000000..b328f5a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_00.dump
@@ -0,0 +1,20 @@
+>"+0#0000e05#ffffff0| |V|i|m| |:|m|a|r|k| |a|n|d| |:|k| |c|o|m@1|a|n|d|s| +0#0000000&@47
+|"+0#0000e05&| |:|k| |n|o|t| |a|v|a|i|l|a|b|l|e| |i|n| |V|i|m|9| +0#0000000&@48
+|"+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |v|i|m|M|a|r|k|A|r|g| |T|o|d|o| +0#0000000&@34
+@75
+@75
+|m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@68
+@75
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@67
+@57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_01.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_01.dump
new file mode 100644
index 0000000..e940ee8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_01.dump
@@ -0,0 +1,20 @@
+|m+0#af5f00255#ffffff0|a|r|k| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@68
+@75
+>:|m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@67
+|:|m+0#af5f00255&|a|r|k| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@67
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@55
+@57|1|9|,|1| @10|6|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump
new file mode 100644
index 0000000..bd0e393
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_02.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@55
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@55
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |m+0#af5f00255&|a|r|k| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@55
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@54
+@57|3|7|,|1| @9|1|5|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_03.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_03.dump
new file mode 100644
index 0000000..19e555f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_03.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@54
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@54
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|m+0#af5f00255&|a|r|k| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@54
+@75
+|k+0#af5f00255&|`+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|'+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|A+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|k+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|[+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|]+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|<+0#0000001#ffff4012| +0#0000000#ffffff0@72
+@57|5@1|,|1| @9|2|5|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_04.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_04.dump
new file mode 100644
index 0000000..bc2c2f6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_04.dump
@@ -0,0 +1,20 @@
+|k+0#af5f00255#ffffff0|<+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@72
+@75
+|:|k+0#af5f00255&|`+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|'+0#0000001#ffff4012| +0#0000000#ffffff0@71
+>:|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|A+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|k+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|[+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|]+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|<+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|:|k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@71
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|`+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|'+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@59
+@57|7|3|,|1| @9|3|4|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump
new file mode 100644
index 0000000..d2b889b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_05.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|A+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|k+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@59
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|[+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|]+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|<+0#0000001#ffff4012| +0#0000000#ffffff0@59
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@59
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|`+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|'+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|A+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|k+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|K+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|z+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@58
+@57|9|1|,|1| @9|4|3|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump
new file mode 100644
index 0000000..224afb2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_06.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|[+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|]+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|<+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&|>+0#0000001#ffff4012| +0#0000000#ffffff0@58
+> @74
+|k+0#af5f00255&| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@71
+@75
+@57|1|0|9|,|0|-|1| @6|5|2|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump
new file mode 100644
index 0000000..a2f23ea
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_07.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|:|k+0#af5f00255&| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@70
+>:|k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|:|k+0#af5f00255&| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@70
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@58
+@57|1|2|7|,|1| @8|6|1|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump
new file mode 100644
index 0000000..27f607a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_08.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@58
+>c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@58
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |k+0#af5f00255&| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@58
+@75
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|`+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|'+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|A+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|k+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|K+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|z+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|Z+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|[+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@57
+@57|1|4|5|,|1| @8|7|0|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump
new file mode 100644
index 0000000..46eaca3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_09.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|]+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|<+0#0000001#ffff4012| +0#0000000#ffffff0@57
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |:|k+0#af5f00255&| +0#0000000&|>+0#0000001#ffff4012| +0#0000000#ffffff0@57
+@75
+@75
+>m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|O@1|"| +0#0000000&@55
+|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@4||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|O@1|"| +0#0000000&@55
+|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@3||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|O@1|"| +0#0000000&@55
+|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@4|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@3|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@58
+@75
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@69
+@2|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@70
+@2|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@66
+@2|:|k+0#af5f00255&| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@68
+@2|:|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@69
+@57|1|6|3|,|1| @8|8|0|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump
new file mode 100644
index 0000000..32cc224
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_10.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@1|:|k+0#af5f00255&|a+0#0000001#ffff4012| +0#0000000#ffffff0@69
+@2|:|m+0#af5f00255&|a|r|k| +0#0000000&|a+0#0000001#ffff4012| +0#0000000#ffffff0@65
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+@75
+>"+0#0000e05&| |E|r@1|o|r|s| +0#0000000&@66
+@75
+|m+0#af5f00255&|a|r|k| +0#0000000&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48
+|"+0#0000e05&| |m|a|r|k| |(| +0#0000000&@66
+|m+0#af5f00255&|a|r|k| +0#0000000&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+|m+0#af5f00255&|a|r|k| +0#0000000&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@68
+@75
+|k+0#af5f00255&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+@57|1|8|1|,|1| @8|8|9|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump
new file mode 100644
index 0000000..c986357
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_11.dump
@@ -0,0 +1,20 @@
+|k+0#af5f00255#ffffff0|"+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48
+|"+0#0000e05&| |k|(| +0#0000000&@70
+>k+0#af5f00255&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+|k+0#af5f00255&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@72
+@75
+|k+0#af5f00255&| +0#0000000&|"+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|^+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|.+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|"+0#0000e05&| +0#0000000&|T+0#0000001#ffff4012|O|D|O|:+0#e000e06#ffffff0| +0#0000e05&|m|a|t|c|h|e|s| |a|s| |v|i|m|F|u|n|c| +0#0000000&@48
+|"+0#0000e05&| |k| |(| +0#0000000&@69
+|k+0#af5f00255&| +0#0000000&|)+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|{+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+@57|1|9@1|,|1| @8|9|8|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump b/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump
new file mode 100644
index 0000000..0206401
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_mark_12.dump
@@ -0,0 +1,20 @@
+|k+0#af5f00255#ffffff0| +0#0000000&|}+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|0+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+|k+0#af5f00255&| +0#0000000&|9+0#ffffff16#ff404010| +0#0000000#ffffff0@71
+> @74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|2|1|5|,|0|-|1| @6|B|o|t| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump
index aea97ed..08ab0b2 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_00.dump
@@ -1,4 +1,7 @@
->s+0#af5f00255#ffffff0|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@54
+>"+0#0000e05#ffffff0| |V|i|m| |:|s|u|b|s|t|i|t|u|t|e| |c|o|m@1|a|n|d| +0#0000000&@49
+@75
+@75
+|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@54
 |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@45
 @75
 |s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@56
@@ -14,7 +17,4 @@
 |:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@46
 @75
 |:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57
-|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@48
-@75
-|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@41
 @57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump
index 253a239..763a0f8 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_01.dump
@@ -1,9 +1,12 @@
-|:+0&#ffffff0|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@46
+|:+0&#ffffff0|s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@44
 @75
-|:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57
+|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@55
+|:|s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@46
+@75
+>:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@57
 |:|s+0#af5f00255&|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@48
 @75
->c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@41
+|c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@41
 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|c|e|g|i|I|n|p|#|l|r| +0#0000000&@32
 @75
 |c+0#af5f00255&|a|l@1| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&||| |s+0#af5f00255&|n|o|m|a|g|i|c|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|&| +0#0000000&@43
@@ -14,7 +17,4 @@
 @75
 |l+0#af5f00255&|e|t| +0#0000000&|f+0#00e0e07&|o@1| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@27
 @75
-|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
-| +0#af5f00255&@1|s|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@53
-@2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
-@57|1|9|,|1| @9|1|0|%| 
+@57|1|9|,|1| @10|6|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump
index 81ab62f..716f4af 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_02.dump
@@ -1,11 +1,15 @@
-| +0&#ffffff0@1|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
+| +0&#ffffff0@74
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+| +0#af5f00255&@1|s|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@53
+@2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
 |e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
-@75
+> @74
 |d+0#af5f00255&|e|f| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@65
 | +0#af5f00255&@1|s|u|b|s|t|i|t|u|t|e|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@53
-@2>l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
+@2|l+0#af5f00255&|e|t| +0#0000000&|b+0#00e0e07&|a|r| +0#0000000&|=+0#af5f00255&| +0#0000000&|s+0#00e0e07&|t|r|-+0#af5f00255&|>|s+0#00e0e07&|u|b|s|t|i|t|u|t|e|(+0#e000e06&|s+0#00e0e07&|t|r|,+0#0000000&| |p+0#00e0e07&|a|t|,+0#0000000&| |s+0#00e0e07&|u|b|,+0#0000000&| |f+0#00e0e07&|l|a|g|s|)+0#e000e06&| +0#0000000&@25
 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
 @75
+@75
 |"+0#0000e05&| |v|a|r|i|o|u|s| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54
 @75
 |s+0#af5f00255&|!+0#e000e06&|/+0#0000000&|!+0#e000e06&|/+0#0000000&@1|!+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
@@ -13,8 +17,4 @@
 |s+0#af5f00255&|#+0#e000e06&|/+0#0000000&|#+0#e000e06&|/+0#0000000&@1|#+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|$+0#e000e06&|/+0#0000000&|$+0#e000e06&|/+0#0000000&@1|$+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|s+0#af5f00255&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|s+0#af5f00255&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000e05#ffffff0|-| |m|a|t|c|h|e|s| |v|i|m|U|s|e|r|F|u|n|c| +0#0000000&@45
-|"+0#0000e05&| |s|(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@55
-@57|3|7|,|3| @9|2|5|%| 
+@57|3|7|,|0|-|1| @7|1|6|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump
index 68aac6b..036a279 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_03.dump
@@ -1,9 +1,13 @@
-|"+0#0000e05#ffffff0| |s|(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@55
-|s+0#af5f00255&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255#ffffff0|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000e05#ffffff0|-| |m|a|t|c|h|e|s| |v|i|m|U|s|e|r|F|u|n|c| +0#0000000&@45
+|"+0#0000e05&| |s|(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@55
+>s+0#af5f00255&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|,+0#e000e06&|/+0#0000000&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
->s+0#af5f00255&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|.+0#e000e06&|/+0#0000000&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|/+0#e000e06&|X+0#0000000&|/+0#e000e06&|X+0#0000000&@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|:+0#e000e06&|/+0#0000000&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
@@ -13,8 +17,4 @@
 |s+0#af5f00255&|>+0#e000e06&|/+0#0000000&|>+0#e000e06&|/+0#0000000&@1|>+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|?+0#e000e06&|/+0#0000000&|?+0#e000e06&|/+0#0000000&@1|?+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|s+0#af5f00255&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|"+0#0000e05&| |s|\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
-|s+0#af5f00255&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|s+0#af5f00255&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-@57|5@1|,|1| @9|3|9|%| 
+@57|5@1|,|1| @9|2|5|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump
index 917b482..b4ea513 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_04.dump
@@ -1,9 +1,13 @@
-|s+0#af5f00255#ffffff0|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
-|s+0#af5f00255&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255#ffffff0|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|"+0#0000e05&| |s|\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
+|s+0#af5f00255&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+>s+0#af5f00255&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |"+0#0000e05&| |s|||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@42
->s+0#af5f00255&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
+|s+0#af5f00255&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 |s+0#af5f00255&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@57
 @75
 |s+0#af5f00255&| +0#0000000&|!+0#e000e06&|/+0#0000000&|!+0#e000e06&|/+0#0000000&@1|!+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
@@ -13,8 +17,4 @@
 |s+0#af5f00255&| +0#0000000&|%+0#e000e06&|/+0#0000000&|%+0#e000e06&|/+0#0000000&@1|%+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|&+0#e000e06&|/+0#0000000&|&+0#e000e06&|/+0#0000000&@1|&+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000e05#ffffff0|-| |m|a|t|c|h|e|s| |v|i|m|U|s|e|r|F|u|n|c| +0#0000000&@45
-|"+0#0000e05&| |s| |(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@54
-|s+0#af5f00255&| +0#0000000&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-@57|7|3|,|1| @9|5|4|%| 
+@57|7|3|,|1| @9|3|5|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump
index 58cc3c8..3b6bc92 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_05.dump
@@ -1,9 +1,13 @@
-|s+0#af5f00255#ffffff0| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255#ffffff0| +0#0000000&|'+0#e000e06&|/+0#0000000&|'+0#e000e06&|/+0#0000000&@1|'+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000e05#ffffff0|-| |m|a|t|c|h|e|s| |v|i|m|U|s|e|r|F|u|n|c| +0#0000000&@45
+|"+0#0000e05&| |s| |(|/|(|/@1|(| |"| |c|o|m@1|e|n|t| +0#0000000&@54
+|s+0#af5f00255&| +0#0000000&|)+0#e000e06&|/+0#0000000&|)+0#e000e06&|/+0#0000000&@1|)+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255&| +0#0000000&|*+0#e000e06&|/+0#0000000&|*+0#e000e06&|/+0#0000000&@1|*+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+>s+0#af5f00255&| +0#0000000&|++0#e000e06&|/+0#0000000&|++0#e000e06&|/+0#0000000&@1|++0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|,+0#e000e06&|/+0#0000000&|,+0#e000e06&|/+0#0000000&@1|,+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|-+0#e000e06&|/+0#0000000&|-+0#e000e06&|/+0#0000000&@1|-+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|.+0#e000e06&|/+0#0000000&|.+0#e000e06&|/+0#0000000&@1|.+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
->s+0#af5f00255&| +0#0000000&|/+0#e000e06&|X+0#0000000&|/+0#e000e06&|X+0#0000000&@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255&| +0#0000000&|/+0#e000e06&|X+0#0000000&|/+0#e000e06&|X+0#0000000&@1|/+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|:+0#e000e06&|/+0#0000000&|:+0#e000e06&|/+0#0000000&@1|:+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|;+0#e000e06&|/+0#0000000&|;+0#e000e06&|/+0#0000000&@1|;+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|<+0#e000e06&|/+0#0000000&|<+0#e000e06&|/+0#0000000&@1|<+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
@@ -13,8 +17,4 @@
 |s+0#af5f00255&| +0#0000000&|@+0#e000e06&|/+0#0000000&|@+0#e000e06&|/+0#0000000&@1|@+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|[+0#e000e06&|/+0#0000000&|[+0#e000e06&|/+0#0000000&@1|[+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |"+0#0000e05&| |s| |\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41
-|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-@57|9|1|,|1| @9|6|8|%| 
+@57|9|1|,|1| @9|4@1|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump
index bc2f4c6..00569af 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_06.dump
@@ -1,20 +1,20 @@
-|s+0#af5f00255#ffffff0| +0#0000000&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-|s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|"+0#0000e05#ffffff0| |s| |\|/|\|/@1|\| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41
+|s+0#af5f00255&| +0#0000000&|]+0#e000e06&|/+0#0000000&|]+0#e000e06&|/+0#0000000&@1|]+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255&| +0#0000000&|^+0#e000e06&|/+0#0000000&|^+0#e000e06&|/+0#0000000&@1|^+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255&| +0#0000000&|_+0#e000e06&|/+0#0000000&|_+0#e000e06&|/+0#0000000&@1|_+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+|s+0#af5f00255&| +0#0000000&|`+0#e000e06&|/+0#0000000&|`+0#e000e06&|/+0#0000000&@1|`+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
+>s+0#af5f00255&| +0#0000000&|{+0#e000e06&|/+0#0000000&|{+0#e000e06&|/+0#0000000&@1|{+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |"+0#0000e05&| |s| |||/|||/@1||| |"| |c|o|m@1|e|n|t| |(|d|i|s|a|l@1|o|w|e|d|)| +0#0000000&@41
 |s+0#af5f00255&| +0#0000000&|}+0#e000e06&|/+0#0000000&|}+0#e000e06&|/+0#0000000&@1|}+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
 |s+0#af5f00255&| +0#0000000&|~+0#e000e06&|/+0#0000000&|~+0#e000e06&|/+0#0000000&@1|~+0#e000e06&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@56
-> @74
+@75
 |s+0#af5f00255&|/+0#e000e06&@1|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62
 |s+0#af5f00255&| +0#0000000&|/+0#e000e06&@1|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61
 @75
 @75
-|"+0#0000e05&| |V|i| |c|o|m|p|a|t|i|b|i|l|i|t|y| +0#0000000&@56
+|"+0#0000e05&| |R|e|p|e|a|t| |c|o|m@1|a|n|d|s| +0#0000000&@57
 @75
-|s+0#af5f00255&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62
-|s+0#af5f00255&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@62
-|s+0#af5f00255&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@62
-@75
-|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61
-|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@61
-|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@61
-@57|1|0|9|,|0|-|1| @6|8|3|%| 
+|s+0#af5f00255&| +0#0000000&@73
+|:|s+0#af5f00255&| +0#0000000&@72
+|s+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@70
+@57|1|0|9|,|1| @8|5|4|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump
index eae48b7..13956ce 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_07.dump
@@ -1,20 +1,20 @@
-|s+0#af5f00255#ffffff0| +0#0000000&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@61
+|s+0#af5f00255#ffffff0| +0#0000000&|4+0#e000002&|2| +0#0000000&@70
+|:|s+0#af5f00255&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69
+|s+0#af5f00255&|4+0#e000002&|2| +0#0000000&@71
+|:|s+0#af5f00255&|4+0#e000002&|2| +0#0000000&@70
 @75
+>s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@62
+|:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&@61
+|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r|4+0#e000002&|2| +0#0000000&@60
+|:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r|4+0#e000002&|2| +0#0000000&@59
+|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@59
+|:|s+0#af5f00255&| +0#0000000&|c+0#e000e06&|e|g|i|I|n|p|#|l|r| +0#0000000&|4+0#e000002&|2| +0#0000000&@58
 @75
-|"+0#0000e05&| |T|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |a|n|d| |b|a|r| +0#0000000&@48
-@75
->s+0#af5f00255&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@64
-|s+0#af5f00255&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@61
-@75
-|s+0#af5f00255&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@63
-|s+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@60
-@75
-@75
-|"+0#0000e05&| |I|s@1|u|e| |#|1|3|8@1|3| +0#0000000&@60
-@75
-|s|t|r|[|s|]| @68
-|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@68
-@75
-|d+0#af5f00255&|e|f| +0#0000000&|T|e|s|t|(+0#e000e06&|)| +0#0000000&@64
-@1| +0#00e0e07&|s|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66
-@57|1|2|7|,|1| @8|9|7|%| 
+|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@72
+|:|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@71
+|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&@71
+|:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@69
+|:|s+0#af5f00255&|g+0#e000e06&| +0#0000000&|4+0#e000002&|2| +0#0000000&@68
+|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@68
+@57|1|2|7|,|1| @8|6|4|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump
index ca53574..bd1b5d0 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_08.dump
@@ -1,20 +1,20 @@
-| +0&#ffffff0| +0#00e0e07&|s|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66
-@2|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66
-|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
-> @74
-|~+0#4040ff13&| @73
+|s+0#af5f00255#ffffff0|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@68
+|:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&|4+0#e000002&|2| +0#0000000&@67
+|s+0#af5f00255&|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@70
+|:|s+0#af5f00255&|g+0#e000e06&|4+0#e000002&|2| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|i|4+0#e000002&|2| +0#0000000&@69
+>:|s+0#af5f00255&|g+0#e000e06&|i|4+0#e000002&|2| +0#0000000&@68
+@75
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
+|&+0#00e0e07&| +0#0000000&@73
+|&+0#af5f00255&@1| +0#0000000&@72
 |~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-| +0#0000000&@56|1|4|3|,|0|-|1| @6|B|o|t| 
+|~|&+0#00e0e07&| +0#0000000&@72
+@75
+|"+0#0000e05&| |F+0#0000001#ffff4012|I|X|M|E| +0#0000000#ffffff0@67
+|&+0#00e0e07&|c+0#0000000&|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@63
+|&+0#af5f00255&@1|c+0#00e0e07&|e|g|i|I|n|p|#|l|r| +0#0000000&@62
+|~|c|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@63
+|~|&+0#00e0e07&|c+0#0000000&|e|g|i|I|n|p|#|l+0#af5f00255&|r| +0#0000000&@62
+@75
+@57|1|4|5|,|1| @8|7|3|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump
new file mode 100644
index 0000000..bbe6bb3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_09.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|"+0#0000e05&| |2| |a|n|d| |3| |l|e|t@1|e|r| |r|e|p|e|a|t|-|p|r|e|v|i|o|u|s| |v|a|r|i|a|n|t|s| +0#0000000&@33
+@75
+|:|s+0#af5f00255&|c+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|c+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|c+0#e000e06&|l| +0#0000000&||| @19
+|:|s+0#af5f00255&|g+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|g+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|g+0#e000e06&|r| +0#0000000&@14
+>:|s+0#af5f00255&|i+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|e| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|i+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|i+0#e000e06&|p| +0#0000000&||| @5||| |:|s+0#af5f00255&|i+0#e000e06&|r| +0#0000000&@14
+|:|s+0#af5f00255&|I+0#e000e06&|c| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|e| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&| +0#0000000&@1||| |:|s+0#af5f00255&|I+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|I+0#e000e06&|r| +0#0000000&@14
+|:|s+0#af5f00255&|r+0#e000e06&|c| +0#0000000&||| @5||| |:|s+0#af5f00255&|r+0#e000e06&|g| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|i| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|I| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|n| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|p| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&|l| +0#0000000&||| |:|s+0#af5f00255&|r+0#e000e06&| +0#0000000&@15
+@75
+@75
+|"+0#0000e05&| |e|x|c|e|p|t|i|o|n|s| +0#0000000&@62
+|:|s+0#af5f00255&|c|r| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|c|r|i|p|t|n|a|m|e|s|`| +0#0000000&@48
+|:|s+0#af5f00255&|e| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|e|t|`| +0#0000000&@56
+|:|s+0#af5f00255&|i|g| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|g|n|`| +0#0000000&@55
+|:|s+0#af5f00255&|i|l| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|i|l|e|n|t|`| +0#0000000&@53
+|:|s+0#af5f00255&|n| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|n|e|x|t|`| +0#0000000&@54
+|:|s+0#af5f00255&|p| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|p|l|i|t|`| +0#0000000&@54
+|:|s+0#af5f00255&|l| +0#0000000&@2|"+0#0000e05&| |i|s| @1|`|:|s|l|e@1|p|`| +0#0000000&@54
+|:|s+0#af5f00255&|r|e| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|r|e|w|i|n|d|`| +0#0000000&@52
+@57|1|6|3|,|1| @8|8|3|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump
new file mode 100644
index 0000000..c04abd2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_10.dump
@@ -0,0 +1,20 @@
+|:+0&#ffffff0|s+0#af5f00255&|r|e| +0#0000000&@1|"+0#0000e05&| |i|s| @1|`|:|s|r|e|w|i|n|d|`| +0#0000000&@52
+@75
+@75
+|"+0#0000e05&| |V|i| |c|o|m|p|a|t|i|b|i|l|i|t|y| +0#0000000&@56
+@75
+>s+0#af5f00255&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@62
+|s+0#af5f00255&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@62
+|s+0#af5f00255&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@62
+@75
+|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|/|{+0#0000000&|s|t|r|i|n|g|}|/+0#e000e06&| +0#0000000&@61
+|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|?|{+0#0000000&|s|t|r|i|n|g|}|?+0#e000e06&| +0#0000000&@61
+|s+0#af5f00255&| +0#0000000&|\+0#e000e06&|&|{+0#0000000&|s|t|r|i|n|g|}|&+0#e000e06&| +0#0000000&@61
+@75
+@75
+|"+0#0000e05&| |T|r|a|i|l|i|n|g| |c|o|m@1|e|n|t| |a|n|d| |b|a|r| +0#0000000&@48
+@75
+|s+0#af5f00255&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@64
+|s+0#af5f00255&||+0#0000000&| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@61
+@75
+@57|1|8|1|,|1| @8|9|2|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump b/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump
new file mode 100644
index 0000000..f63455a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_substitute_11.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|s+0#af5f00255&| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@63
+|s+0#af5f00255&| +0#0000000&||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@60
+@75
+@75
+>"+0#0000e05&| |I|s@1|u|e| |#|1|3|8@1|3| +0#0000000&@60
+@75
+|s|t|r|[|s|]| @68
+|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@68
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|T|e|s|t|(+0#e000e06&|)| +0#0000000&@64
+@1| +0#00e0e07&|s|t|r|[+0#0000000&|s+0#00e0e07&|]+0#0000000&| @66
+@2|s|t|r|(+0#e000e06&|s+0#00e0e07&|)+0#e000e06&| +0#0000000&@66
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|9@1|,|1| @8|B|o|t| 
diff --git a/runtime/syntax/testdir/input/vim_ex_mark.vim b/runtime/syntax/testdir/input/vim_ex_mark.vim
new file mode 100644
index 0000000..31df3b2
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_mark.vim
@@ -0,0 +1,215 @@
+" Vim :mark and :k commands
+" :k not available in Vim9
+" VIM_TEST_SETUP hi link vimMarkArg Todo
+
+
+mark `
+mark '
+mark a
+mark A
+mark k
+mark K
+mark z
+mark Z
+mark [
+mark ]
+mark <
+mark >
+
+:mark `
+:mark '
+:mark a
+:mark A
+:mark k
+:mark K
+:mark z
+:mark Z
+:mark [
+:mark ]
+:mark <
+:mark >
+
+call Foo() | mark `
+call Foo() | mark '
+call Foo() | mark a
+call Foo() | mark A
+call Foo() | mark k
+call Foo() | mark K
+call Foo() | mark z
+call Foo() | mark Z
+call Foo() | mark [
+call Foo() | mark ]
+call Foo() | mark <
+call Foo() | mark >
+
+call Foo() | :mark `
+call Foo() | :mark '
+call Foo() | :mark a
+call Foo() | :mark A
+call Foo() | :mark k
+call Foo() | :mark K
+call Foo() | :mark z
+call Foo() | :mark Z
+call Foo() | :mark [
+call Foo() | :mark ]
+call Foo() | :mark <
+call Foo() | :mark >
+
+k`
+k'
+ka
+kA
+kk
+kK
+kz
+kZ
+k[
+k]
+k<
+k>
+
+:k`
+:k'
+:ka
+:kA
+:kk
+:kK
+:kz
+:kZ
+:k[
+:k]
+:k<
+:k>
+
+call Foo() | k`
+call Foo() | k'
+call Foo() | ka
+call Foo() | kA
+call Foo() | kk
+call Foo() | kK
+call Foo() | kz
+call Foo() | kZ
+call Foo() | k[
+call Foo() | k]
+call Foo() | k<
+call Foo() | k>
+
+call Foo() | :k`
+call Foo() | :k'
+call Foo() | :ka
+call Foo() | :kA
+call Foo() | :kk
+call Foo() | :kK
+call Foo() | :kz
+call Foo() | :kZ
+call Foo() | :k[
+call Foo() | :k]
+call Foo() | :k<
+call Foo() | :k>
+
+k `
+k '
+k a
+k A
+k k
+k K
+k z
+k Z
+k [
+k ]
+k <
+k >
+
+:k `
+:k '
+:k a
+:k A
+:k k
+:k K
+:k z
+:k Z
+:k [
+:k ]
+:k <
+:k >
+
+call Foo() | k `
+call Foo() | k '
+call Foo() | k a
+call Foo() | k A
+call Foo() | k k
+call Foo() | k K
+call Foo() | k z
+call Foo() | k Z
+call Foo() | k [
+call Foo() | k ]
+call Foo() | k <
+call Foo() | k >
+
+call Foo() | :k `
+call Foo() | :k '
+call Foo() | :k a
+call Foo() | :k A
+call Foo() | :k k
+call Foo() | :k K
+call Foo() | :k z
+call Foo() | :k Z
+call Foo() | :k [
+call Foo() | :k ]
+call Foo() | :k <
+call Foo() | :k >
+
+
+mark a | echo "FOO"
+ka     | echo "FOO"
+k a    | echo "FOO"
+mark a " comment
+ka     " comment
+k a    " comment
+
+
+function Foo()
+  k a
+  ka
+  mark a
+  :k a
+  :ka
+  :mark a
+endfunction
+
+
+" Errors
+
+mark "
+mark ^
+mark .
+" TODO: matches as vimFunc
+" mark (
+mark )
+mark {
+mark }
+mark 0
+mark 9
+
+k"
+k^
+k.
+" TODO: matches as vimFunc
+" k(
+k)
+k{
+k}
+k0
+k9
+
+k "
+k ^
+k .
+" TODO: matches as vimFunc
+" k (
+k )
+k {
+k }
+k 0
+k 9
+
diff --git a/runtime/syntax/testdir/input/vim_ex_substitute.vim b/runtime/syntax/testdir/input/vim_ex_substitute.vim
index 7ffd16d..983b39d 100644
--- a/runtime/syntax/testdir/input/vim_ex_substitute.vim
+++ b/runtime/syntax/testdir/input/vim_ex_substitute.vim
@@ -1,3 +1,6 @@
+" Vim :substitute command
+
+
 substitute/foo/bar/&
 substitute/foo/bar/cegiInp#lr
 
@@ -37,6 +40,7 @@
   let bar = str->substitute(str, pat, sub, flags)
 enddef
 
+
 " various delimiters
 
 s!/!//! " comment
@@ -111,6 +115,67 @@
 s //{string}/
 
 
+" Repeat commands
+
+s
+:s
+s 42
+:s 42
+s42
+:s42
+
+s cegiInp#lr
+:s cegiInp#lr
+s cegiInp#lr42
+:s cegiInp#lr42
+s cegiInp#lr 42
+:s cegiInp#lr 42
+
+sg
+:sg
+sgi
+:sgi
+sg 42
+:sg 42
+sgi 42
+:sgi 42
+sg42
+:sg42
+sgi42
+:sgi42
+
+" FIXME
+&
+&&
+~
+~&
+
+" FIXME
+&cegiInp#lr
+&&cegiInp#lr
+~cegiInp#lr
+~&cegiInp#lr
+
+" 2 and 3 letter repeat-previous variants
+
+:sc  | :sce | :scg | :sci | :scI | :scn | :scp | :scl |
+:sgc | :sge | :sg  | :sgi | :sgI | :sgn | :sgp | :sgl | :sgr
+:sic | :sie |      | :si  | :siI | :sin | :sip |      | :sir
+:sIc | :sIe | :sIg | :sIi | :sI  | :sIn | :sIp | :sIl | :sIr
+:src |      | :srg | :sri | :srI | :srn | :srp | :srl | :sr
+
+
+" exceptions
+:scr  " is  `:scriptnames`
+:se   " is  `:set`
+:sig  " is  `:sign`
+:sil  " is  `:silent`
+:sn   " is  `:snext`
+:sp   " is  `:split`
+:sl   " is  `:sleep`
+:sre  " is  `:srewind`
+
+
 " Vi compatibility
 
 s\/{string}/
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index 1ff7d71..eb24216 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -34,8 +34,8 @@
 " regular vim commands {{{2
 " GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand contained', END_STR='nextgroup=vimBang'
 syn keyword vimCommand contained abo[veleft] 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] cabo[ve] cad[dbuffer] cadde[xpr] caddf[ile] caf[ter] 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] clo[se] cle[arjumps] cn[ext] cnew[er] cnf[ile] co[py] col[der] colo[rscheme] com[mand] comc[lear] comp[iler] con[tinue] conf[irm] nextgroup=vimBang
-syn keyword vimCommand contained cons[t] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] d[elete] delm[arks] deb[ug] defc[ompile] defe[r] 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] em[enu] endfo[r] endt[ry] endw[hile] ene[w] ev[al] ex exi[t] exu[sage] f[ile] files filet[ype] fin[d] fina[lly] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldd[oopen] folddoc[losed] foldo[pen] g[lobal] go[to] gu[i] gv[im] h[elp] helpc[lose] helpf[ind] helpt[ags] ha[rdcopy] hi[ghlight] hid[e] his[tory] hor[izontal] ij[ump] il[ist] int[ro] ip[ut] is[earch] isp[lit] j[oin] ju[mps] k kee[pmarks] keepj[umps] keepp[atterns] nextgroup=vimBang
-syn keyword vimCommand contained 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] lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lhi[story] ll lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loc[kmarks] lockv[ar] lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lw[indow] ls m[ove] ma[rk] marks menut[ranslate] mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] 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] pb[uffer] nextgroup=vimBang
+syn keyword vimCommand contained cons[t] cope[n] cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] d[elete] delm[arks] deb[ug] defc[ompile] defe[r] 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] em[enu] endfo[r] endt[ry] endw[hile] ene[w] ev[al] ex exi[t] exu[sage] f[ile] files filet[ype] fin[d] fina[lly] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldd[oopen] folddoc[losed] foldo[pen] g[lobal] go[to] gu[i] gv[im] h[elp] helpc[lose] helpf[ind] helpt[ags] ha[rdcopy] hi[ghlight] hid[e] his[tory] hor[izontal] ij[ump] il[ist] int[ro] ip[ut] is[earch] isp[lit] j[oin] ju[mps] kee[pmarks] keepj[umps] keepp[atterns] nextgroup=vimBang
+syn keyword vimCommand contained 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] lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] lg[etfile] lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lhi[story] ll lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loc[kmarks] lockv[ar] lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lw[indow] ls m[ove] marks menut[ranslate] mes[sages] mk[exrc] mks[ession] mksp[ell] mkv[imrc] mkvie[w] mod[e] 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] pb[uffer] nextgroup=vimBang
 syn keyword vimCommand contained pc[lose] ped[it] po[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] pw[d] q[uit] quita[ll] qa[ll] r[ead] rec[over] red[o] redr[aw] redraws[tatus] redrawt[abline] redrawtabp[anel] reg[isters] res[ize] ret[ab] 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] scr[iptnames] scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] sf[ind] sfir[st] sh[ell] sim[alt] sig[n] sil[ent] sla[st] sn[ext] so[urce] sp[lit] spe[llgood] spelld[ump] nextgroup=vimBang
 syn keyword vimCommand contained spelli[nfo] spellr[epall] spellra[re] spellu[ndo] spellw[rong] spr[evious] sre[wind] st[op] sta[g] star[tinsert] startg[replace] startr[eplace] stopi[nsert] stj[ump] sts[elect] 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] te[aroff] ter[minal] tf[irst] tj[ump] tl[ast] tn[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] u[ndo] undoj[oin] undol[ist] unh[ide] unlo[ckvar] uns[ilent] up[date] v[global] ve[rsion] verb[ose] vert[ical] vi[sual] vie[w] vim9[cmd] viu[sage] vne[w] vs[plit] w[rite] wN[ext] wa[ll] wi[nsize] winc[md] wind[o] winp[os] nextgroup=vimBang
 syn keyword vimCommand contained wn[ext] wp[revious] wq wqa[ll] wu[ndo] wv[iminfo] x[it] xa[ll] xr[estore] y[ank] z dl dell delel deletl deletel dp dep delp delep deletp deletep a i nextgroup=vimBang
@@ -286,7 +286,7 @@
 syn case match
 
 " All vimCommands are contained by vimIsCommand. {{{2
-syn cluster vimCmdList	contains=vimAbb,vimAddress,vimAutocmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDoautocmd,vimDebuggreedy,vimDef,vimDefFold,vimDelcommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimFor,vimFunction,vimFuncFold,vimGrep,vimGrepAdd,vimGlobal,vimHelpgrep,vimHighlight,vimImport,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimThrow,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl
+syn cluster vimCmdList	contains=vimAbb,vimAddress,vimAutocmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDoautocmd,vimDebuggreedy,vimDef,vimDefFold,vimDelcommand,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimExMark,vimFor,vimFunction,vimFuncFold,vimGrep,vimGrepAdd,vimGlobal,vimHelpgrep,vimHighlight,vimImport,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimThrow,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl
 syn cluster vim9CmdList	contains=vim9Abstract,vim9Class,vim9Const,vim9Enum,vim9Export,vim9Final,vim9For,vim9Interface,vim9Type,vim9Var
 syn match vimCmdSep	"\\\@1<!|"	skipwhite nextgroup=@vimCmdList,vimSubst1,vimFunc
 syn match vimCmdSep	":\+"	skipwhite nextgroup=@vimCmdList,vimSubst1
@@ -901,10 +901,16 @@
 syn cluster	vimSubstList	contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTwoBS,vimSubstRange,vimNotation
 syn cluster	vimSubstRepList	contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
 syn cluster	vimSubstList	add=vimCollection
-syn match	vimSubst	"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>"			skipwhite nextgroup=vimSubstPat
-syn match	vimSubst	"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@="		skipwhite nextgroup=vimSubstPat
-syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[_#]\@="	skipwhite nextgroup=vimSubstPat
+syn match	vimSubst		"^\s*\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)\%(\d\+\)\@="	skipwhite nextgroup=vimSubstCount
+syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\>"		skipwhite nextgroup=vimSubstPat,vimSubstFlags,vimSubstCount
 syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)[_#]\@="	skipwhite nextgroup=vimSubstPat
+syn match	vimSubst1	contained	"\%(s\%[ubstitute]\|sm\%[agic]\>\|sno\%[magic]\)\%(\d\+\)\@="	skipwhite nextgroup=vimSubstCount
+syn match	vimSubstFlagErr	contained	"[^< \t\r|]\+" contains=vimSubstFlags
+" & and # after :s are always pattern delimiters not flags
+syn match	vimSubstFlags	contained	"[&cegiIlnpr#]\+"	skipwhite nextgroup=vimSubstCount
+syn match	vimSubstCount	contained	"\d\+\>"
 " TODO: Vim9 illegal separators for abbreviated :s form are [-.:], :su\%[...] required
 "     : # is allowed but "not recommended" (see :h pattern-delimiter)
 syn region	vimSubstPat	contained	matchgroup=vimSubstDelim start="\z([!#$%&'()*+,-./:;<=>?@[\]^_`{}~]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1	contains=@vimSubstList	nextgroup=vimSubstRep4	oneline
@@ -914,13 +920,41 @@
 syn match	vimCollClass	contained 	transparent	"\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
 syn match	vimSubstSubstr	contained	"\\z\=\d"
 syn match	vimSubstTwoBS	contained	"\\\\"
-syn match	vimSubstFlagErr	contained	"[^< \t\r|]\+" contains=vimSubstFlags
-syn match	vimSubstFlags	contained	"[&cegiIlnpr#]\+"
+
+" TODO: flags, unlike count, must follow immediately
+"     : distinguish from with Vim9 &var
+" syn match	vimSubst		"^\s*\zs&&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst		"^\s*\zs\~&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst1	contained	"&&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+" syn match	vimSubst1	contained	"\~&\="	skipwhite nextgroup=vimSubstFlags,vimSubstCount
+
+" two and three letter variants (matched as :s + flags, count may follow immediately)
+syn match	vimSubst		"^\s*\zssc[egiIlnp]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssg[ceiIlnpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssi[ceInpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssI[ceginplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst		"^\s*\zssr[cgiInplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+
+syn match	vimSubst1	contained	"\<sc[egiIlnp]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sg[ceiIlnpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<si[ceInpr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sI[ceginplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
+syn match	vimSubst1	contained	"\<sr[cgiInplr]\=\a\@!"	skipwhite nextgroup=vimSubstCount	contains=vimSubstFlags
 
 " Vi compatibility
 syn match	vimSubstDelim	contained	"\\"
 syn match	vimSubstPat	contained	"\\\ze[/?&]" contains=vimSubstDelim nextgroup=vimSubstRep4
 
+" Mark: {{{2
+" ====
+VimL syn match	vimExMark	"\<k\%([a-zA-Z0-9]\>\|[[\]<>'`]\)\@="         nextgroup=@vimMarkArg
+VimL syn match	vimExMark	"\<k\>"	      	skipwhite nextgroup=@vimMarkArg
+syn match	vimExMark	"\<mark\>"	      	skipwhite nextgroup=@vimMarkArg
+
+syn match	vimMarkArg	contained	"[a-zA-Z]\>\|[[\]<>'`]"	skipwhite nextgroup=vimCmdSep,vimComment
+syn match	vimMarkArgError	contained	"["^.(){}0-9]"
+syn cluster	vimMarkArg	contains=vimMarkArg,vimMarkArgError
+
 " Marks, Registers, Addresses, Filters: {{{2
 syn match	vimMark	"'[a-zA-Z0-9]\ze[-+,!]"	nextgroup=vimFilter,vimMarkNumber,vimSubst1
 syn match	vimMark	"'[[\]{}()<>]\ze[-+,!]"	nextgroup=vimFilter,vimMarkNumber,vimSubst1
@@ -2002,6 +2036,7 @@
   hi def link vimHiCtermError	vimError
   hi def link vimHiKeyError	vimError
   hi def link vimMapModErr	vimError
+  hi def link vimMarkArgError	vimError
   hi def link vimShebangError	vimError
   hi def link vimSortOptionsError	Error
   hi def link vimSubstFlagErr	vimError
@@ -2071,6 +2106,7 @@
  hi def link vimEscape	Special
  hi def link vimExFilter	vimCommand
  hi def link vimExFilterBang	vimCommand
+ hi def link vimExMark	vimCommand
  hi def link vimFBVar	vimVar
  hi def link vimFgBgAttrib	vimHiAttrib
  hi def link vimFuncEcho	vimCommand
@@ -2222,6 +2258,7 @@
  hi def link vimStringEnd	vimString
  hi def link vimStringInterpolationBrace	vimEscape
  hi def link vimSubst1	vimSubst
+ hi def link vimSubstCount	Number
  hi def link vimSubstDelim	Delimiter
  hi def link vimSubstFlags	Special
  hi def link vimSubstSubstr	SpecialChar