runtime(vim): Update syntax, improve user-command matching

Commit: 
https://github.com/vim/vim/commit/3c07eb0c6730c258c6955ce8458cf911245c1617
Author: Doug Kearns <dougkea...@gmail.com>
Date:   Mon Sep 2 10:03:37 2024 +0200

    runtime(vim): Update syntax, improve user-command matching
    
    - Match -addr and -keepscript attributes and generate -addr values.
    - Match attribute errors where = is specified.
    - Highlight attributes with Special like other Ex command options.
    - Don't highlight user-specified completion function args.
    - Match :delcommand -buffer attribute.
    
    closes: #15586
    
    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 480038e82..a6604e5af 100644
--- a/runtime/syntax/generator/gen_syntax_vim.vim
+++ b/runtime/syntax/generator/gen_syntax_vim.vim
@@ -1,9 +1,7 @@
 " Vim syntax file generator
 " Language: Vim script
 " Maintainer: Hirohito Higashi (h_east)
-" URL: https://github.com/vim-jp/syntax-vim-ex
-" Last Change: 2024 Aug 23
-" Version: 2.1.1
+" Last Change: 2024 Aug 30
 
 let s:keepcpo= &cpo
 set cpo&vim
@@ -288,6 +286,7 @@ function! s:get_vim_command_type(cmd_name)
                call
                catch
                def
+               delcommand
                doautoall
                doautocmd
                echo
@@ -551,6 +550,44 @@ function! s:parse_vim_complete_name(li)
        endtry
 endfunc
 
+" 
------------------------------------------------------------------------------
+function! s:parse_vim_addr_name(li)
+       try
+               let file_name = $VIM_SRCDIR . '/usercmd.c'
+               let item = {}
+
+               new
+               exec 'read ' . file_name
+               norm! gg
+               exec '/^static addrtype_T addr_type_complete_tab\[] 
=$/+1;/^};$/-1yank'
+               %delete _
+
+               put
+               g!/^\s*ADDRTYPE_ENTRY(/d
+
+               for line in getline(1, line('$'))
+                       let list = matchlist(line, 
'^\s*ADDRTYPE_ENTRY(ADDR_\w\+,\s*"\(\w\+\)",\s*"\(.*\)"')
+                       let item.name = list[1]
+                       call add(a:li, copy(item))
+                       let item.name = list[2]
+                       call add(a:li, copy(item))
+               endfor
+
+               " '?' is not in 'iskeyword' and cannot be used as keyword, so 
remove it.
+               " (Separately specified as 'syn match' in vim.vim.base).
+               call filter(a:li, {idx, val -> val.name !=# '?'})
+
+               quit!
+
+               if empty(a:li)
+                       throw 'addr_name is empty'
+               endif
+       catch /.*/
+               call s:err_gen('')
+               throw 'exit'
+       endtry
+endfunc
+
 " 
------------------------------------------------------------------------------
 function! s:append_syn_any(lnum, str_info, li)
        let ret_lnum = a:lnum
@@ -658,7 +695,12 @@ function! s:update_syntax_vim_file(vim_info)
 
                " vimUserAttrbCmplt
                let li = a:vim_info.compl_name
-               let lnum = s:search_and_check('vimUserAttrbCmplt', base_fname, 
str_info)
+               let lnum = s:search_and_check('vimUserCmdAttrCmplt', 
base_fname, str_info)
+               let lnum = s:append_syn_any(lnum, str_info, li)
+
+               " vimUserAttrbAddr
+               let li = a:vim_info.addr_name
+               let lnum = s:search_and_check('vimUserCmdAttrAddr', base_fname, 
str_info)
                let lnum = s:append_syn_any(lnum, str_info, li)
 
                " vimCommand - abbrev
@@ -731,6 +773,7 @@ try
        let s:vim_info.func = []
        let s:vim_info.hlgroup = []
        let s:vim_info.compl_name = []
+       let s:vim_info.addr_name = []
 
        set lazyredraw
        silent call s:parse_vim_option(s:vim_info.opt, s:vim_info.missing_opt,
@@ -740,6 +783,7 @@ try
        silent call s:parse_vim_function(s:vim_info.func)
        silent call s:parse_vim_hlgroup(s:vim_info.hlgroup)
        silent call s:parse_vim_complete_name(s:vim_info.compl_name)
+       silent call s:parse_vim_addr_name(s:vim_info.addr_name)
 
        call s:update_syntax_vim_file(s:vim_info)
        set nolazyredraw
diff --git a/runtime/syntax/generator/vim.vim.base 
b/runtime/syntax/generator/vim.vim.base
index 03812087e..30e6bc3ce 100644
--- a/runtime/syntax/generator/vim.vim.base
+++ b/runtime/syntax/generator/vim.vim.base
@@ -2,7 +2,6 @@
 " Language:       Vim script
 " Maintainer:     Hirohito Higashi <h.east.727 ATMARK gmail.com>
 "         Doug Kearns <dougkea...@gmail.com>
-" URL:    https://github.com/vim-jp/syntax-vim-ex
 " Last Change:    2024 Aug 30
 " Former Maintainer: Charles E. Campbell
 
@@ -185,10 +184,11 @@ syn match vimNumber       '\%(^\|\A\)\zs#\x\{6}'          
skipwhite nextgroup=vimGlobal,vimSub
 syn case match
 
 " All vimCommands are contained by vimIsCommand. {{{2
-syn cluster vimCmdList 
contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimLoadkeymap,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
+syn cluster vimCmdList 
contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,vimDelcommand,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimLoadkeymap,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
 syn cluster vim9CmdList        contains=vim9Const,vim9Final,vim9For,vim9Var
 syn match vimCmdSep    "[:|]\+"        skipwhite 
nextgroup=@vimCmdList,vimSubst1
 syn match vimIsCommand "\<\%(\h\w*\|[23]mat\%[ch]\)\>" contains=vimCommand
+syn match vimBang            contained "!"
 syn match vimVar             contained "\<\h[a-zA-Z0-9#_]*\>"
 syn match vimVar               "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
 syn match vimVar               "\s\zs&\%([lg]:\)\= \+\>"
@@ -362,32 +362,44 @@ syn match vimSpecFileMod  "\(:[phtre]\)\+"        
contained
 " User-Specified Commands: {{{2
 " =======================
 syn cluster    vimUserCmdList  
contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
-syn keyword    vimUserCommand  contained       com[mand]
-syn match      vimUserCmdName  contained       "\<\u\w*\>" 
nextgroup=vimUserCmdBlock skipwhite
-syn match      vimUserCmd      "\<com\%[mand]!\=\>.*$" 
contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter,vimCmdBlock,vimUserCmdName
-syn match      vimUserAttrbError       contained       "- \+\ze\s"
-syn match      vimUserAttrb    contained       "-nargs=[01*?+]"        
contains=vimUserAttrbKey,vimOper
-syn match      vimUserAttrb    contained       "-complete="            
contains=vimUserAttrbKey,vimOper nextgroup=vimUserAttrbCmplt,vimUserCmdError
-syn match      vimUserAttrb    contained       "-range\(=%\|=\d\+\)\=" 
contains=vimNumber,vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-count\(=\d\+\)\="     
contains=vimNumber,vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-bang\>"               
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-bar\>"                
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-buffer\>"             
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-register\>"           
contains=vimOper,vimUserAttrbKey
+syn keyword    vimUserCmdKey   contained       com[mand]
+syn match      vimUserCmdName  contained       "\<\u[[:alnum:]]*\>"    
skipwhite nextgroup=vimUserCmdBlock
+syn match      vimUserCmd              "\<com\%[mand]\>!\=.*$" 
contains=vimUserCmdKey,vimBang,vimUserCmdAttr,vimUserCmdAttrError,vimUserCmdName,@vimUserCmdList,vimComFilter
+syn match      vimUserCmdAttrError     contained       "- \+\ze\%(\s\|=\)"
+syn match      vimUserCmdAttr  contained       "-addr="                
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
+syn match      vimUserCmdAttr  contained       "-bang\>"               
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-bar\>"                
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-buffer\>"             
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-complete="            
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrCmplt,vimUserCmdError
+syn match      vimUserCmdAttr  contained       "-count\>"              
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-count="               
contains=vimUserCmdAttrKey nextgroup=vimNumber
+syn match      vimUserCmdAttr  contained       "-keepscript\>"         
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-nargs="               
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
+syn match      vimUserCmdAttr  contained       "-range\>"              
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-range="               
contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
+syn match      vimUserCmdAttr  contained       "-register\>"           
contains=vimUserCmdAttrKey
+
+syn match      vimUserCmdAttrNargs     contained       "[01*?+]"
+syn match      vimUserCmdAttrRange     contained       "%"
+
 if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
  syn match     vimUserCmdError contained       "\S\+\>"
 endif
-syn case ignore
-syn keyword    vimUserAttrbKey   contained     bar     ban[g]  cou[nt] ra[nge] 
com[plete]      n[args] re[gister]
-" GEN_SYN_VIM: vimUserAttrbCmplt, START_STR='syn keyword vimUserAttrbCmplt 
contained', END_STR=''
-syn keyword    vimUserAttrbCmplt contained     custom customlist 
nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
-syn match      vimUserAttrbCmpltFunc contained 
",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 
nextgroup=vimUserCmdError
 
+syn case ignore
+syn keyword    vimUserCmdAttrKey   contained   a[ddr] ban[g] bar bu[ffer] 
com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister]
+" GEN_SYN_VIM: vimUserCmdAttrCmplt, START_STR='syn keyword vimUserCmdAttrCmplt 
contained', END_STR=''
+syn keyword    vimUserCmdAttrCmplt     contained       custom customlist 
nextgroup=vimUserCmdAttrCmpltFunc,vimUserCmdError
+syn match      vimUserCmdAttrCmpltFunc contained       
",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 
nextgroup=vimUserCmdError
+" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr 
contained', END_STR=''
+syn match      vimUserCmdAttrAddr      contained       "?"
 syn case match
-syn match      vimUserAttrbCmplt contained     "custom,\u\w*"
 
 syn region     vimUserCmdBlock contained       matchgroup=vimSep start="{" 
end="}" contains=@vimDefBodyList
 
+syn match      vimDelcommand           "\<delc\%[ommand]\>" skipwhite 
nextgroup=vimDelcommandAttr
+syn match      vimDelcommandAttr       contained       "-buffer\>"
+
 " Lower Priority Comments: after some vim commands... {{{2
 " =======================
 if get(g:, "vimsyn_comment_strings", 1)
@@ -1162,6 +1174,8 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimDefComment     vim9Comment
  hi def link vimDefKey vimCommand
  hi def link vimDefParam vimVar
+ hi def link vimDelcommand     vimCommand
+ hi def link vimDelcommandAttr vimUserCmdAttr
  hi def link vimEcho   vimCommand
  hi def link vimEchohlNone     vimGroup
  hi def link vimEchohl vimCommand
@@ -1319,13 +1333,15 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimUnlet  vimCommand
  hi def link vimUnletBang      vimBang
  hi def link vimUnmap  vimMap
- hi def link vimUserAttrbCmpltFunc     Special
- hi def link vimUserAttrbCmplt vimSpecial
- hi def link vimUserAttrbKey   vimOption
- hi def link vimUserAttrb      vimSpecial
- hi def link vimUserAttrbError Error
+ hi def link vimUserCmdAttrAddr        vimSpecial
+ hi def link vimUserCmdAttrCmplt       vimSpecial
+ hi def link vimUserCmdAttrNargs       vimSpecial
+ hi def link vimUserCmdAttrRange       vimSpecial
+ hi def link vimUserCmdAttrKey vimUserCmdAttr
+ hi def link vimUserCmdAttr    Special
+ hi def link vimUserCmdAttrError       Error
  hi def link vimUserCmdError   Error
- hi def link vimUserCommand    vimCommand
+ hi def link vimUserCmdKey     vimCommand
  hi def link vimUserFunc       Normal
  hi def link vimVar    Identifier
  hi def link vimWarn   WarningMsg
diff --git a/runtime/syntax/testdir/dumps/vim9_comment_01.dump 
b/runtime/syntax/testdir/dumps/vim9_comment_01.dump
index 736d47df3..dbd59d548 100644
--- a/runtime/syntax/testdir/dumps/vim9_comment_01.dump
+++ b/runtime/syntax/testdir/dumps/vim9_comment_01.dump
@@ -4,7 +4,7 @@
 @2|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&|#+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@46
 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
 > @74
-|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|-+0#af5f00255&|c+0#e000e06&|o|u|n|t| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@47
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|c|o|u|n|t| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@47
 | +0#0000e05&@1|#| |V|i|m|9|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51
 @2|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&|#+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@46
 |}+0#e000e06&| +0#0000000&@73
diff --git a/runtime/syntax/testdir/dumps/vim_comment_00.dump 
b/runtime/syntax/testdir/dumps/vim_comment_00.dump
index 335fc3f16..1e99be90c 100644
--- a/runtime/syntax/testdir/dumps/vim_comment_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_comment_00.dump
@@ -14,7 +14,7 @@
 @2|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&|#+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@46
 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
 @75
-|c+0#af5f00255&|o|m@1|a|n|d| 
+0#0000000&|-+0#af5f00255&|n+0#e000e06&|a|r|g|s|=+0#af5f00255&|1+0#00e0003&| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@45
+|c+0#af5f00255&|o|m@1|a|n|d| 
+0#0000000&|-+0#e000e06&|n|a|r|g|s|=|1+0#00e0003&| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@45
 | +0#0000e05&@1|#| |V|i|m|9|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51
 @2|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&|#+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@46
 @57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/vim_comment_01.dump 
b/runtime/syntax/testdir/dumps/vim_comment_01.dump
index ebf0c4252..6b1234d85 100644
--- a/runtime/syntax/testdir/dumps/vim_comment_01.dump
+++ b/runtime/syntax/testdir/dumps/vim_comment_01.dump
@@ -1,7 +1,7 @@
 | +0&#ffffff0@1|"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| 
+0#0000000&|#+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@46
 |e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
 @75
-|c+0#af5f00255&|o|m@1|a|n|d| 
+0#0000000&|-+0#af5f00255&|n+0#e000e06&|a|r|g|s|=+0#af5f00255&|1+0#00e0003&| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@45
+|c+0#af5f00255&|o|m@1|a|n|d| 
+0#0000000&|-+0#e000e06&|n|a|r|g|s|=|1+0#00e0003&| 
+0#0000000&|F|o@1|C|o|m@1|a|n|d| |{+0#e000e06&| +0#0000000&@45
 | +0#0000e05&@1|#| |V|i|m|9|-|s|c|r|i|p|t| |c|o|m@1|e|n|t| +0#0000000&@51
 @2>"+0#e000002&|u|s|e|l|e|s@1| |s|t|r|i|n|g|"| +0#0000000&|#+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@46
 |}+0#e000e06&| +0#0000000&@73
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_00.dump 
b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
index 31238891a..b9326415a 100644
--- a/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_00.dump
@@ -1,20 +1,20 @@
->"+0#0000e05#ffffff0| |V|i|m| |:|c|o|m@1|a|n|d| |c|o|m@1|a|n|d| +0#0000000&@52
+>"+0#0000e05#ffffff0| |V|i|m| |:|c|o|m@1|a|n|d|,| |:|d|e|l|c|o|m@1|a|n|d| 
|a|n|d| |:|c|o|m|c|l|e|a|r| |c|o|m@1|a|n|d|s| +0#0000000&@24
 @75
-|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| +0#0000000&@60
 @75
-|c+0#af5f00255&|o|m| +0#0000000&|F|o@1| |c+0#af5f00255&|a|l@1| 
+0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#0000000&|'+0#e000002&|l|s|'|)+0#0000000&|
 @49
-|~+0#4040ff13&| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-|~| @73
-| +0#0000000&@56|1|,|1| @10|A|l@1| 
+|"+0#0000e05&| |l|i|s|t| +0#0000000&@68
+@75
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@67
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&|F| @65
+@75
+|"+0#0000e05&| |d|e|f|i|n|e| +0#0000000&@66
+@75
+|c+0#af5f00255&|o|m@1|a|n|d| +0#0000000&@1|F|o@1| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@51
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&||| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@38
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@60
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@62
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@62
+|}+0#e000e06&| +0#0000000&@73
+@57|1|,|1| @10|T|o|p| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_01.dump 
b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump
new file mode 100644
index 000000000..347a4f798
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_01.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |{+0#e000e06&| +0#0000000&@60
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@62
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|r|"| +0#0000000&@62
+@2|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|B|a|z|"| +0#0000000&@62
+>}+0#e000e06&| +0#0000000&@73
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| 
+0#0000000&|-+0#e000e06&|a|d@1|r|=|a+0#00e0003&|r|g|u|m|e|n|t|s| 
+0#0000000&|-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#e000e06&|b|a|r| 
+0#0000000&|-+0#e000e06&|b|u|f@1|e|r| 
+0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|a+0#00e0003&|r|g|l|i|s|t| 
+0#0000000&|-+0#e000e06&|c|o|u|n|t|=|1+0#e000002&| 
+0#0000000&|-+0#e000e06&|k|e@1
+|p|s|c|r|i|p|t| +0#0000000&|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| 
+0#0000000&|-+0#e000e06&|r|a|n|g|e|=|%+0#00e0003&| 
+0#0000000&|-+0#e000e06&|r|e|g|i|s|t|e|r| +0#0000000&|F|o@1| @35
+@6|\+0#e000e06&| +0#0000000&|e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@56
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| 
+0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|,+0#0000000&|C|o|m|p|l|e|t|e|r|1|
 |F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@23
+|c+0#af5f00255&|o|m@1|a|n|d|!| 
+0#0000000&|-+0#e000e06&|c|o|m|p|l|e|t|e|=|c+0#00e0003&|u|s|t|o|m|l|i|s|t|,+0#0000000&|C|o|m|p|l|e|t|e|r|2|
 |F|o@1| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@19
+@75
+|f+0#af5f00255&|u|n|c|t|i|o|n| +0#0000000&|F|o@1|(+0#e000e06&|)| +0#0000000&@60
+@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|f|u|n|c|t|i|o|n|)|"| 
+0#0000000&@26
+|e+0#af5f00255&|n|d|f|u|n|c|t|i|o|n| +0#0000000&@63
+@75
+|d+0#af5f00255&|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64
+@57|1|9|,|1| @9|2|3|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_02.dump 
b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump
new file mode 100644
index 000000000..00a82981f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_02.dump
@@ -0,0 +1,20 @@
+|d+0#af5f00255#ffffff0|e|f| +0#0000000&|F|o@1|2|(+0#e000e06&|)| +0#0000000&@64
+@2|c+0#af5f00255&|o|m@1|a|n|d|!| +0#0000000&|F|o@1| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|F|o@1| |(|d|e|f|i|n|e|d| |i|n| |:|d|e|f|)|"| 
+0#0000000&@31
+|e+0#af5f00255&|n|d@1|e|f| +0#0000000&@68
+@75
+|"+0#0000e05&| |m|u|l|t|i|l|i|n|e| |d|e|f|i|n|e| +0#0000000&@56
+> @74
+|"+0#0000e05&| |c|o|m@1|a|n|d|!| +0#0000000&@64
+|"+0#0000e05&| @6|\| |-|a|d@1|r|=|l|i|n|e|s| +0#0000000&@53
+|"+0#0000e05&| @6|\| |-|b|a|n|g| +0#0000000&@59
+|"+0#0000e05&| @6|\| |-|b|a|r| +0#0000000&@60
+|"+0#0000e05&| @6|\| |-|b|u|f@1|e|r| +0#0000000&@57
+|"+0#0000e05&| @6|\| |-|c|o|m|p|l|e|t|e|=|b|u|f@1|e|r| +0#0000000&@48
+|"+0#0000e05&| @6|\| |-|c|o|u|n|t| +0#0000000&@58
+|"+0#0000e05&| @6|\| |-|n|a|r|g|s|=|*| +0#0000000&@56
+|"+0#0000e05&| @6|\| |-|r|a|n|g|e| +0#0000000&@58
+|"+0#0000e05&| @6|\| |-|r|e|g|i|s|t|e|r| +0#0000000&@55
+|"+0#0000e05&| @6|\| |-|k|e@1|p|s|c|r|i|p|t| +0#0000000&@53
+|"+0#0000e05&| @6|\| |F|o@1| | +0#0000000&@60
+|"+0#0000e05&| @6|\| |e|c|h|o| |"+0#e000002&|F|O@1|"| +0#0000000&@54
+@57|3|6|,|0|-|1| @7|5|4|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_03.dump 
b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump
new file mode 100644
index 000000000..43dbd555e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_03.dump
@@ -0,0 +1,20 @@
+|"+0#0000e05#ffffff0| @6|\| |e|c|h|o| |"+0#e000002&|F|O@1|"| +0#0000000&@54
+@75
+|"+0#0000e05&| |e|r@1|o|r|s| +0#0000000&@66
+@75
+|c+0#af5f00255&|o|m@1|a|n|d|!| 
+0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r|=+0#af5f00255#ffffff0|a+0#0000000&|r|g|u|m|e|n|t|s|
 |-+0#e000e06&|b|a|n|g| +0#0000000&|-+0#ffffff16#ff404010|b|a|d|a|t@1|r| 
+0#0000000#ffffff0|-+0#e000e06&|n|a|r|g|s|=|*+0#00e0003&| +0#0000000&|F|o@1| 
|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|F|o@1|"| +0#0000000&@8
+> @74
+|"+0#0000e05&| |d|e|l|e|t|e| +0#0000000&@66
+@75
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| @60
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| 
+0#0000000&|F|o@1| @52
+@75
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| ||| 
|e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@47
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| 
+0#0000000&|F|o@1| ||| |e+0#af5f00255&|c|h|o| +0#0000000&|"+0#e000002&|.@2|"| 
+0#0000000&@39
+@75
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|F|o@1| |"+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@50
+|d+0#af5f00255&|e|l|c|o|m@1|a|n|d| +0#0000000&|-+0#e000e06&|b|u|f@1|e|r| 
+0#0000000&|F|o@1| |"+0#0000e05&| |c|o|m@1|e|n|t| +0#0000000&@42
+@75
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&@66
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| |c|o|m@1|e|n|t| 
+0#0000000&@56
+@57|5|4|,|0|-|1| @7|8|7|%| 
diff --git a/runtime/syntax/testdir/dumps/vim_ex_command_04.dump 
b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump
new file mode 100644
index 000000000..8e66db657
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/vim_ex_command_04.dump
@@ -0,0 +1,20 @@
+|c+0#af5f00255#ffffff0|o|m|c|l|e|a|r| +0#0000000&|"+0#0000e05&| 
|c|o|m@1|e|n|t| +0#0000000&@56
+|c+0#af5f00255&|o|m|c|l|e|a|r| +0#0000000&||| |e+0#af5f00255&|c|h|o| 
+0#0000000&|"+0#e000002&|.@2|"| +0#0000000&@53
+@75
+@75
+|"+0#0000e05&| |I|s@1|u|e| |#|1|4|1|3|5| +0#0000000&@60
+> @74
+|c+0#af5f00255&|o|m| +0#0000000&|F|o@1| |c+0#af5f00255&|a|l@1| 
+0#0000000&|s+0#00e0e07&|y|s|t|e|m|(+0#0000000&|'+0#e000002&|l|s|'|)+0#0000000&|
 @49
+@75
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|7|2|,|0|-|1| @7|B|o|t| 
diff --git a/runtime/syntax/testdir/input/vim_ex_command.vim 
b/runtime/syntax/testdir/input/vim_ex_command.vim
index 9e982965b..0873648cb 100644
--- a/runtime/syntax/testdir/input/vim_ex_command.vim
+++ b/runtime/syntax/testdir/input/vim_ex_command.vim
@@ -1,5 +1,74 @@
-" Vim :command command
+" Vim :command, :delcommand and :comclear commands
+
+
+" list
+
+command
+command F
+
+" define
+
+command  Foo echo "Foo"
+command! Foo echo "Foo"
+command! Foo echo "Foo" | echo "Bar"
+
+command! Foo {
+  echo "Foo"
+  echo "Bar"
+  echo "Baz"
+}
+
+command! -addr=arguments -bang -bar -buffer -complete=arglist -count=1 
-keepscript -nargs=* -range=% -register Foo
+      \ echo "Foo"
+
+command! -complete=custom,Completer1 Foo echo "Foo"
+command! -complete=customlist,Completer2 Foo echo "Foo"
+
+function Foo()
+  command! Foo echo "Foo (defined in :function)"
+endfunction
+
+def Foo2()
+  command! Foo echo "Foo (defined in :def)"
+enddef
+
+" multiline define
+
+" command!
+"       \ -addr=lines
+"       \ -bang
+"       \ -bar
+"       \ -buffer
+"       \ -complete=buffer
+"       \ -count
+"       \ -nargs=*
+"       \ -range
+"       \ -register
+"       \ -keepscript
+"       \ Foo 
+"       \ echo "FOO"
+
+" errors
+
+command! -badattr=arguments -bang -badattr -nargs=* Foo echo "Foo"
+
+" delete
+
+delcommand Foo
+delcommand -buffer Foo
+
+delcommand Foo | echo "..."
+delcommand -buffer Foo | echo "..."
+
+delcommand Foo " comment
+delcommand -buffer Foo " comment
+
+comclear
+comclear " comment
+comclear | echo "..."
+
 
 " Issue #14135
 
 com Foo call system('ls')
+
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index e290a7092..247663d4d 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -2,7 +2,6 @@
 " Language:       Vim script
 " Maintainer:     Hirohito Higashi <h.east.727 ATMARK gmail.com>
 "         Doug Kearns <dougkea...@gmail.com>
-" URL:    https://github.com/vim-jp/syntax-vim-ex
 " Last Change:    2024 Aug 30
 " Former Maintainer: Charles E. Campbell
 
@@ -29,8 +28,8 @@ syn cluster vimCommentGroup   contains=vimTodo,@Spell
 " regular vim commands {{{2
 " GEN_SYN_VIM: vimCommand normal, START_STR='syn keyword vimCommand 
contained', END_STR=''
 syn keyword vimCommand contained abo[veleft] abs[tract] al[l] ar[gs] arga[dd] 
argd[elete] argdo argded[upe] arge[dit] argg[lobal] argl[ocal] argu[ment] 
as[cii] b[uffer] bN[ext] ba[ll] bad[d] balt bd[elete] bel[owright] bf[irst] 
bl[ast] bm[odified] bn[ext] bo[tright] bp[revious] br[ewind] brea[k] breaka[dd] 
breakd[el] breakl[ist] bro[wse] buffers bufd[o] bun[load] bw[ipeout] c[hange] 
cN[ext] cNf[ile] 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] class clo[se] cle[arjumps] cn[ext] 
cnew[er] cnf[ile] co[py] col[der] colo[rscheme] com[mand] comc[lear] comp[iler]
-syn keyword vimCommand contained con[tinue] conf[irm] cons[t] cope[n] 
cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] d[elete] 
delm[arks] deb[ug] debugg[reedy] defc[ompile] defe[r] delc[ommand] 
delf[unction] di[splay] dif[fupdate] diffg[et] diffo[ff] diffp[atch] diffpu[t] 
diffs[plit] difft[his] dig[raphs] disa[ssemble] dj[ump] dli[st] dr[op] 
ds[earch] dsp[lit] e[dit] ea[rlier] el[se] elsei[f] em[enu] en[dif] 
endin[terface] endc[lass] ende[num] endfo[r] endt[ry] endw[hile] ene[w] enu[m] 
ev[al] ex exi[t] exp[ort] exu[sage] f[ile] files filet[ype] filt[er] fin[d] 
finall[y] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] foldd[oopen] 
folddoc[losed] foldo[pen] g[lobal] go[to] gr[ep] grepa[dd] gu[i] gv[im] h[elp] 
helpc[lose] helpf[ind] helpg[rep] helpt[ags]
-syn keyword vimCommand contained ha[rdcopy] hi[ghlight] hid[e] his[tory] 
ho[rizontal] if ij[ump] il[ist] imp[ort] int[ro] inte[rface] is[earch] isp[lit] 
j[oin] ju[mps] k kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] l[ist] 
lN[ext] lNf[ile] la[st] lab[ove] lan[guage] lad[dexpr] laddb[uffer] laddf[ile] 
laf[ter] lat[er] lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lc[d] lch[dir] lcl[ose] 
lcs[cope] ld[o] le[ft] lefta[bove] lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] 
lg[etfile] lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lh[elpgrep] lhi[story] ll 
lla[st] lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loc[kmarks] 
lockv[ar] lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lua luad[o] 
luaf[ile] lv[imgrep] lvimgrepa[dd] lw[indow] ls m[ove] ma[rk] mak[e] marks 
menut[ranslate]
+syn keyword vimCommand contained con[tinue] conf[irm] cons[t] cope[n] 
cp[revious] cpf[ile] cq[uit] cr[ewind] cs[cope] cst[ag] cw[indow] d[elete] 
delm[arks] deb[ug] debugg[reedy] 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] el[se] elsei[f] em[enu] en[dif] endin[terface] endc[lass] ende[num] 
endfo[r] endt[ry] endw[hile] ene[w] enu[m] ev[al] ex exi[t] exp[ort] exu[sage] 
f[ile] files filet[ype] filt[er] fin[d] finall[y] fini[sh] fir[st] fix[del] 
fo[ld] foldc[lose] foldd[oopen] folddoc[losed] foldo[pen] g[lobal] go[to] 
gr[ep] grepa[dd] gu[i] gv[im] h[elp] helpc[lose] helpf[ind] helpg[rep] 
helpt[ags] ha[rdcopy]
+syn keyword vimCommand contained hi[ghlight] hid[e] his[tory] ho[rizontal] if 
ij[ump] il[ist] imp[ort] int[ro] inte[rface] is[earch] isp[lit] j[oin] ju[mps] 
k kee[pmarks] keepj[umps] keepp[atterns] keepa[lt] l[ist] lN[ext] lNf[ile] 
la[st] lab[ove] lan[guage] lad[dexpr] laddb[uffer] laddf[ile] laf[ter] lat[er] 
lb[uffer] lbe[fore] lbel[ow] lbo[ttom] lc[d] lch[dir] lcl[ose] lcs[cope] ld[o] 
le[ft] lefta[bove] lex[pr] leg[acy] lf[ile] lfd[o] lfir[st] lg[etfile] 
lgetb[uffer] lgete[xpr] lgr[ep] lgrepa[dd] lh[elpgrep] lhi[story] ll lla[st] 
lli[st] lmak[e] lne[xt] lnew[er] lnf[ile] lo[adview] loc[kmarks] lockv[ar] 
lol[der] lop[en] lp[revious] lpf[ile] lr[ewind] lt[ag] lua luad[o] luaf[ile] 
lv[imgrep] lvimgrepa[dd] lw[indow] ls m[ove] ma[rk] mak[e] marks menut[ranslate]
 syn keyword vimCommand contained mes[sages] mk[exrc] mks[ession] mksp[ell] 
mkv[imrc] mkvie[w] mod[e] mz[scheme] mzf[ile] n[ext] nb[key] nbc[lose] 
nbs[tart] noa[utocmd] noh[lsearch] nos[wapfile] nu[mber] o[pen] ol[dfiles] 
on[ly] opt[ions] ow[nsyntax] p[rint] pa[ckadd] packl[oadall] pc[lose] pe[rl] 
perld[o] ped[it] po[p] pp[op] pre[serve] prev[ious] pro[mptfind] promptr[epl] 
prof[ile] profd[el] ps[earch] pt[ag] ptN[ext] ptf[irst] ptj[ump] ptl[ast] 
ptn[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pub[lic] pw[d] py[thon] 
pyd[o] pyf[ile] py3 py3d[o] python3 py3f[ile] pyx pyxd[o] pythonx pyxf[ile] 
q[uit] quita[ll] qa[ll] r[ead] rec[over] red[o] redi[r] redr[aw] redraws[tatus] 
redrawt[abline] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] 
rightb[elow] ru[ntime]
 syn keyword vimCommand contained rub[y] rubyd[o] rubyf[ile] rund[o] rv[iminfo] 
sN[ext] sa[rgument] sal[l] san[dbox] sav[eas] sb[uffer] sbN[ext] sba[ll] 
sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbp[revious] sbr[ewind] sc[riptnames] 
scripte[ncoding] scriptv[ersion] scs[cope] setf[iletype] sf[ind] sfir[st] 
sh[ell] si[malt] sig[n] sil[ent] sla[st] sn[ext] so[urce] sor[t] sp[lit] 
spe[llgood] spelld[ump] spelli[nfo] spellr[epall] spellra[re] spellu[ndo] 
spellw[rong] spr[evious] sr[ewind] st[op] sta[g] star[tinsert] startg[replace] 
startr[eplace] stat[ic] stopi[nsert] stj[ump] sts[elect] sun[hide] sus[pend] 
sv[iew] sw[apname] 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]
 syn keyword vimCommand contained tabp[revious] tabN[ext] tabr[ewind] tabs 
tc[d] tch[dir] tcl tcld[o] tclf[ile] te[aroff] ter[minal] tf[irst] thi[s] 
tj[ump] tl[ast] tn[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] ty[pe] 
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] vim[grep] vimgrepa[dd] vim9[cmd] 
viu[sage] vne[w] vs[plit] w[rite] wN[ext] wa[ll] wh[ile] wi[nsize] winc[md] 
wind[o] winp[os] wn[ext] wp[revious] wq wqa[ll] wu[ndo] wv[iminfo] x[it] xa[ll] 
xr[estore] y[ank] z dl dell delel deletl deletel dp dep delp delep deletp 
deletep a i
@@ -223,10 +222,11 @@ syn match vimNumber       '\%(^\|\A\)\zs#\x\{6}'          
skipwhite nextgroup=vimGlobal,vimSub
 syn case match
 
 " All vimCommands are contained by vimIsCommand. {{{2
-syn cluster vimCmdList 
contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimLoadkeymap,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
+syn cluster vimCmdList 
contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,vimDelcommand,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimLoadkeymap,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
 syn cluster vim9CmdList        contains=vim9Const,vim9Final,vim9For,vim9Var
 syn match vimCmdSep    "[:|]\+"        skipwhite 
nextgroup=@vimCmdList,vimSubst1
 syn match vimIsCommand "\<\%(\h\w*\|[23]mat\%[ch]\)\>" contains=vimCommand
+syn match vimBang            contained "!"
 syn match vimVar             contained "\<\h[a-zA-Z0-9#_]*\>"
 syn match vimVar               "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
 syn match vimVar               "\s\zs&\%([lg]:\)\= \+\>"
@@ -400,33 +400,46 @@ syn match vimSpecFileMod  "\(:[phtre]\)\+"        
contained
 " User-Specified Commands: {{{2
 " =======================
 syn cluster    vimUserCmdList  
contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
-syn keyword    vimUserCommand  contained       com[mand]
-syn match      vimUserCmdName  contained       "\<\u\w*\>" 
nextgroup=vimUserCmdBlock skipwhite
-syn match      vimUserCmd      "\<com\%[mand]!\=\>.*$" 
contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter,vimCmdBlock,vimUserCmdName
-syn match      vimUserAttrbError       contained       "- \+\ze\s"
-syn match      vimUserAttrb    contained       "-nargs=[01*?+]"        
contains=vimUserAttrbKey,vimOper
-syn match      vimUserAttrb    contained       "-complete="            
contains=vimUserAttrbKey,vimOper nextgroup=vimUserAttrbCmplt,vimUserCmdError
-syn match      vimUserAttrb    contained       "-range\(=%\|=\d\+\)\=" 
contains=vimNumber,vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-count\(=\d\+\)\="     
contains=vimNumber,vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-bang\>"               
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-bar\>"                
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-buffer\>"             
contains=vimOper,vimUserAttrbKey
-syn match      vimUserAttrb    contained       "-register\>"           
contains=vimOper,vimUserAttrbKey
+syn keyword    vimUserCmdKey   contained       com[mand]
+syn match      vimUserCmdName  contained       "\<\u[[:alnum:]]*\>"    
skipwhite nextgroup=vimUserCmdBlock
+syn match      vimUserCmd              "\<com\%[mand]\>!\=.*$" 
contains=vimUserCmdKey,vimBang,vimUserCmdAttr,vimUserCmdAttrError,vimUserCmdName,@vimUserCmdList,vimComFilter
+syn match      vimUserCmdAttrError     contained       "- \+\ze\%(\s\|=\)"
+syn match      vimUserCmdAttr  contained       "-addr="                
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
+syn match      vimUserCmdAttr  contained       "-bang\>"               
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-bar\>"                
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-buffer\>"             
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-complete="            
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrCmplt,vimUserCmdError
+syn match      vimUserCmdAttr  contained       "-count\>"              
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-count="               
contains=vimUserCmdAttrKey nextgroup=vimNumber
+syn match      vimUserCmdAttr  contained       "-keepscript\>"         
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-nargs="               
contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
+syn match      vimUserCmdAttr  contained       "-range\>"              
contains=vimUserCmdAttrKey
+syn match      vimUserCmdAttr  contained       "-range="               
contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
+syn match      vimUserCmdAttr  contained       "-register\>"           
contains=vimUserCmdAttrKey
+
+syn match      vimUserCmdAttrNargs     contained       "[01*?+]"
+syn match      vimUserCmdAttrRange     contained       "%"
+
 if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
  syn match     vimUserCmdError contained       "\S\+\>"
 endif
-syn case ignore
-syn keyword    vimUserAttrbKey   contained     bar     ban[g]  cou[nt] ra[nge] 
com[plete]      n[args] re[gister]
-" GEN_SYN_VIM: vimUserAttrbCmplt, START_STR='syn keyword vimUserAttrbCmplt 
contained', END_STR=''
-syn keyword vimUserAttrbCmplt contained arglist augroup behave breakpoint 
buffer color command compiler cscope diff_buffer dir dir_in_path environment 
event expression file file_in_path filetype function help highlight history 
keymap locale mapclear mapping menu messages option packadd runtime scriptnames 
shellcmd sign syntax syntime tag tag_listfiles user var
-syn keyword    vimUserAttrbCmplt contained     custom customlist 
nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
-syn match      vimUserAttrbCmpltFunc contained 
",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 
nextgroup=vimUserCmdError
 
+syn case ignore
+syn keyword    vimUserCmdAttrKey   contained   a[ddr] ban[g] bar bu[ffer] 
com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister]
+" GEN_SYN_VIM: vimUserCmdAttrCmplt, START_STR='syn keyword vimUserCmdAttrCmplt 
contained', END_STR=''
+syn keyword vimUserCmdAttrCmplt contained arglist augroup behave breakpoint 
buffer color command compiler cscope diff_buffer dir dir_in_path environment 
event expression file file_in_path filetype function help highlight history 
keymap locale mapclear mapping menu messages option packadd runtime scriptnames 
shellcmd sign syntax syntime tag tag_listfiles user var
+syn keyword    vimUserCmdAttrCmplt     contained       custom customlist 
nextgroup=vimUserCmdAttrCmpltFunc,vimUserCmdError
+syn match      vimUserCmdAttrCmpltFunc contained       
",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 
nextgroup=vimUserCmdError
+" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr 
contained', END_STR=''
+syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line 
loaded_buffers load other quickfix qf tabs tab windows win
+syn match      vimUserCmdAttrAddr      contained       "?"
 syn case match
-syn match      vimUserAttrbCmplt contained     "custom,\u\w*"
 
 syn region     vimUserCmdBlock contained       matchgroup=vimSep start="{" 
end="}" contains=@vimDefBodyList
 
+syn match      vimDelcommand           "\<delc\%[ommand]\>" skipwhite 
nextgroup=vimDelcommandAttr
+syn match      vimDelcommandAttr       contained       "-buffer\>"
+
 " Lower Priority Comments: after some vim commands... {{{2
 " =======================
 if get(g:, "vimsyn_comment_strings", 1)
@@ -1207,6 +1220,8 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimDefComment     vim9Comment
  hi def link vimDefKey vimCommand
  hi def link vimDefParam vimVar
+ hi def link vimDelcommand     vimCommand
+ hi def link vimDelcommandAttr vimUserCmdAttr
  hi def link vimEcho   vimCommand
  hi def link vimEchohlNone     vimGroup
  hi def link vimEchohl vimCommand
@@ -1364,13 +1379,15 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimUnlet  vimCommand
  hi def link vimUnletBang      vimBang
  hi def link vimUnmap  vimMap
- hi def link vimUserAttrbCmpltFunc     Special
- hi def link vimUserAttrbCmplt vimSpecial
- hi def link vimUserAttrbKey   vimOption
- hi def link vimUserAttrb      vimSpecial
- hi def link vimUserAttrbError Error
+ hi def link vimUserCmdAttrAddr        vimSpecial
+ hi def link vimUserCmdAttrCmplt       vimSpecial
+ hi def link vimUserCmdAttrNargs       vimSpecial
+ hi def link vimUserCmdAttrRange       vimSpecial
+ hi def link vimUserCmdAttrKey vimUserCmdAttr
+ hi def link vimUserCmdAttr    Special
+ hi def link vimUserCmdAttrError       Error
  hi def link vimUserCmdError   Error
- hi def link vimUserCommand    vimCommand
+ hi def link vimUserCmdKey     vimCommand
  hi def link vimUserFunc       Normal
  hi def link vimVar    Identifier
  hi def link vimWarn   WarningMsg

-- 
-- 
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 on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1sl2DI-006KpW-SZ%40256bit.org.

Raspunde prin e-mail lui