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

Commit: 
https://github.com/vim/vim/commit/086b3b5b796368bca767e43ba22584391357a10a
Author: Doug Kearns <dougkea...@gmail.com>
Date:   Sat May 31 17:52:48 2025 +0200

    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 <dougkea...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/syntax/generator/gen_syntax_vim.vim 
b/runtime/syntax/generator/gen_syntax_vim.vim
index e3317fca7..5cafa10d6 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 @@ function s:get_vim_command_type(cmd_name)
                import
                interface
                insert
+               k
                let
                loadkeymap
                lhelpgrep
@@ -307,6 +308,7 @@ function s:get_vim_command_type(cmd_name)
                luafile
                map
                mapclear
+               mark
                match
                mzscheme
                mzfile
diff --git a/runtime/syntax/generator/vim.vim.base 
b/runtime/syntax/generator/vim.vim.base
index 5b3b82669..759bd91bd 100644
--- a/runtime/syntax/generator/vim.vim.base
+++ b/runtime/syntax/generator/vim.vim.base
@@ -233,7 +233,7 @@ syn match   vimNumber       
'\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*'    skipwhite nextgroup=@vi
 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 region        vimContinueString       contained       
matchgroup=vimContinueString start=+$'+ s
 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       "[^<    
|]\+" 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 vimCollClassErr contained       "\[:.\{-\}:\]"
 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       "[^<    
|]\+" 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]\= \@!"      
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssg[ceiIlnpr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssi[ceInpr]\= \@!"       
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssI[ceginplr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssr[cgiInplr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+
+syn match      vimSubst1       contained       "\<sc[egiIlnp]\= \@!"   
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sg[ceiIlnpr]\= \@!"  
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<si[ceInpr]\= \@!"    
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sI[ceginplr]\= \@!"  
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sr[cgiInplr]\= \@!"  
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 @@ if !exists("skip_vim_syntax_inits")
   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 @@ if !exists("skip_vim_syntax_inits")
  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 @@ if !exists("skip_vim_syntax_inits")
  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 000000000..b328f5a41
--- /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 000000000..e940ee803
--- /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 000000000..bd0e393c9
--- /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 000000000..19e555f99
--- /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 000000000..bc2c2f675
--- /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 000000000..d2b889b8b
--- /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 000000000..224afb2d1
--- /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 000000000..a2f23ea0f
--- /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 000000000..27f607a6c
--- /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 000000000..46eaca326
--- /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 000000000..32cc2249a
--- /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 000000000..c986357c0
--- /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 000000000..02064018c
--- /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 aea97ed4b..08ab0b29e 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 253a239e0..763a0f889 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 81ab62f1d..716f4af1d 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 68aac6b09..036a279ff 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 917b48240..b4ea513b8 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 58cc3c82e..3b6bc92f5 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 bc2f4c6c2..00569af72 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
-@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
+|"+0#0000e05&| |R|e|p|e|a|t| |c|o|m@1|a|n|d|s| +0#0000000&@57
 @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 eae48b7c4..13956ce91 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
-@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
-|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#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
+|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 ca53574fd..bd1b5d0b1 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
-|~| @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| 
+|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
+|~|&+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 000000000..bbe6bb3b2
--- /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 000000000..c04abd269
--- /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 000000000..f63455a42
--- /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 000000000..31df3b268
--- /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 7ffd16ddd..983b39d04 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 @@ def Foo()
   let bar = str->substitute(str, pat, sub, flags)
 enddef
 
+
 " various delimiters
 
 s!/!//! " comment
@@ -111,6 +115,67 @@ s//{string}/
 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 1ff7d71d7..eb24216a7 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -34,8 +34,8 @@ syn cluster vimCommentGroup   contains=vimTodo,@Spell
 " 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 match   vimNumber       
'\<0z\%(\x\x\)\+\%(\.\%(\x\x\)\+\)*'    skipwhite nextgroup=@vi
 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 region        vimContinueString       contained       
matchgroup=vimContinueString start=+$'+ s
 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       "[^<    
|]\+" 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 vimCollClassErr contained       "\[:.\{-\}:\]"
 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       "[^<    
|]\+" 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]\= \@!"      
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssg[ceiIlnpr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssi[ceInpr]\= \@!"       
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssI[ceginplr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst                "^\s*\zssr[cgiInplr]\= \@!"     
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+
+syn match      vimSubst1       contained       "\<sc[egiIlnp]\= \@!"   
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sg[ceiIlnpr]\= \@!"  
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<si[ceInpr]\= \@!"    
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sI[ceginplr]\= \@!"  
skipwhite nextgroup=vimSubstCount       contains=vimSubstFlags
+syn match      vimSubst1       contained       "\<sr[cgiInplr]\= \@!"  
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 @@ if !exists("skip_vim_syntax_inits")
   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 @@ if !exists("skip_vim_syntax_inits")
  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 @@ if !exists("skip_vim_syntax_inits")
  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

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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1uLOcw-009P4D-JI%40256bit.org.

Raspunde prin e-mail lui