Update runtime files
diff --git a/runtime/syntax/context.vim b/runtime/syntax/context.vim
index b29f256..08ab1f6 100644
--- a/runtime/syntax/context.vim
+++ b/runtime/syntax/context.vim
@@ -1,141 +1,144 @@
-" Vim syntax file
-" Language:           ConTeXt typesetting engine
-" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
-" Former Maintainers: Nikolai Weibull <now@bitwi.se>
-" Latest Revision:    2016 Oct 16
+vim9script
+
+# Vim syntax file
+# Language:           ConTeXt typesetting engine
+# Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision:    2022 Aug 12
 
 if exists("b:current_syntax")
   finish
 endif
 
-runtime! syntax/plaintex.vim
-unlet b:current_syntax
+# Dictionary of (filetype, group) pairs to highlight between \startGROUP \stopGROUP.
+var context_include = get(b:, 'context_include', get(g:, 'context_include', {'xml': 'XML'}))
 
-let s:cpo_save = &cpo
-set cpo&vim
-
-" Dictionary of (filetype, group) pairs to highlight between \startGROUP \stopGROUP.
-let s:context_include = get(b:, 'context_include', get(g:, 'context_include', {'xml': 'XML'}))
-
-" For backward compatibility (g:context_include used to be a List)
-if type(s:context_include) ==# type([])
-  let g:context_metapost = (index(s:context_include, 'mp') != -1)
-  let s:context_include = filter(
-        \ {'c': 'C', 'javascript': 'JS', 'ruby': 'Ruby', 'xml': 'XML'},
-        \ { k,_ -> index(s:context_include, k) != -1 }
-        \ )
+# Deprecation warning
+if type(context_include) ==# type([])
+  echomsg "[ConTeXt] b:context_include/g:context_include must be Dictionaries."
+  context_include = {'xml': 'XML'}
 endif
 
-syn iskeyword @,48-57,a-z,A-Z,192-255
+syn iskeyword @,48-57,_,!,?,a-z,A-Z,192-255
 
-syn spell   toplevel
+syn spell toplevel
 
-" ConTeXt options, i.e., [...] blocks
-syn region  contextOptions    matchgroup=contextDelimiter start='\['  end=']\|\ze\\stop' skip='\\\[\|\\\]' contains=ALLBUT,contextBeginEndLua,@Spell
+runtime! syntax/shared/context-data-context.vim
+runtime! syntax/shared/context-data-interfaces.vim
+runtime! syntax/shared/context-data-tex.vim
 
-" Highlight braces
+syn match contextCommand '\\\k\+\>' display contains=@NoSpell
+
+# ConTeXt options, i.e., [...] blocks
+syn region  contextOptions    matchgroup=contextDelimiter start='\[' end=']\|\ze\\stop' skip='\\\[\|\\\]' contains=TOP,@Spell
+
+# Highlight braces
 syn match   contextDelimiter  '[{}]'
 
-" Comments
-syn match   contextComment '\\\@<!\%(\\\\\)*\zs%.*$' display contains=initexTodo
-syn match   contextComment '^\s*%[CDM].*$'           display contains=initexTodo
+# Comments
+syn match   contextComment    '\%(\_^\|[^\\]\)\%(\\\\\)*\zs%.*$' display contains=contextTodo,contextMagicLine
+syn match   contextComment    '^\s*%[CDM].*$'                    display contains=contextTodo,contextMagicLine
+syn keyword contextTodo       TODO FIXME XXX NOTE                contained
+syn match   contextMagicLine  '^\s*%\s*!TEX.*$'                  contained
 
-syn match   contextBlockDelim '\\\%(start\|stop\)\a\+' contains=@NoSpell
+syn match   contextBlockDelim '\\\%(start\|stop\)\k\+' contains=@NoSpell
 
 syn region  contextEscaped    matchgroup=contextPreProc start='\\type\%(\s*\|\n\)*\z([^A-Za-z%]\)' end='\z1'
 syn region  contextEscaped    matchgroup=contextPreProc start='\\type\=\%(\s\|\n\)*{' end='}'
 syn region  contextEscaped    matchgroup=contextPreProc start='\\type\=\%(\s*\|\n\)*<<' end='>>'
 syn region  contextEscaped    matchgroup=contextPreProc
                               \ start='\\start\z(\a*\%(typing\|typen\)\)'
-                              \ end='\\stop\z1' contains=plaintexComment keepend
+                              \ end='\\stop\z1' contains=contextComment keepend
 syn region  contextEscaped    matchgroup=contextPreProc start='\\\h\+Type\%(\s\|\n\)*{' end='}'
 syn region  contextEscaped    matchgroup=contextPreProc start='\\Typed\h\+\%(\s\|\n\)*{' end='}'
 
-syn match   contextBuiltin    display contains=@NoSpell
-      \ '\\\%(unprotect\|protect\|unexpanded\)\>'
+syn match   contextBuiltin    '\\unexpanded\>' display contains=@NoSpell
 
-syn match   contextPreProc    '^\s*\\\%(start\|stop\)\=\%(component\|environment\|project\|product\)\>'
-                              \ contains=@NoSpell
+# \unprotect... \protect regions
+syn region  contextUnprotect  matchgroup=contextBuiltin start='\\unprotect' end='\\protect' contains=TOP
+syn match   contextSequence   '\\[a-zA-Z]*[@_!?]\+[a-zA-Z@_!?]*' contains=@NoSpell contained containedin=contextUnprotect
 
-if get(b:, 'context_metapost', get(g:, 'context_metapost', 1))
-  let b:mp_metafun_macros = 1 " Highlight MetaFun keywords
-  syn include @mpTop          syntax/mp.vim
+# Math
+syn match  contextMathCmd '\\m\%(ath\%(ematics\)\=\)\=\>'
+syn region contextInlineMath matchgroup=contextMathDelim start='\$' skip='\\\\\|\\\$' end='\$'
+syn region contextDisplayMath matchgroup=contextMathDelim start='\$\$' skip='\\\\\|\\\$' end='\$\$' keepend
+syn region contextDisplayMath matchgroup=contextBlockDelim start='\\startformula' end='\\stopformula' contains=TOP
+
+# MetaFun
+b:mp_metafun = 1
+syn include @mpTop syntax/mp.vim
+unlet b:current_syntax
+
+syn region  contextMPGraphic  matchgroup=contextBlockDelim
+      \ start='\\start\z(MP\%(clip\|code\|definitions\|drawing\|environment\|extensions\|inclusions\|initializations\|page\|\)\)\>.*$'
+      \ end='\\stop\z1'
+      \ contains=@mpTop,@NoSpell
+syn region  contextMPGraphic  matchgroup=contextBlockDelim
+      \ start='\\start\z(\%(\%[re]usable\|use\|unique\|static\)MPgraphic\|staticMPfigure\|uniqueMPpagegraphic\)\>.*$'
+      \ end='\\stop\z1'
+      \ contains=@mpTop,@NoSpell
+
+# Lua
+syn include @luaTop syntax/lua.vim
+unlet b:current_syntax
+
+syn region  contextLuaCode    matchgroup=contextBlockDelim
+      \ start='\\startluacode\>'
+      \ end='\\stopluacode\>' keepend
+      \ contains=@luaTop,@NoSpell
+syn match   contextDirectLua  "\\\%(directlua\|ctxlua\)\>\%(\s*%.*$\)\="
+      \ nextgroup=contextBeginEndLua skipwhite skipempty
+      \ contains=contextComment
+syn region  contextBeginEndLua matchgroup=contextSpecial
+      \ start="{" end="}" skip="\\[{}]"
+      \ contained contains=@luaTop,@NoSpell
+
+for synname in keys(context_include)
+  execute 'syn include @' .. synname .. 'Top' 'syntax/' .. synname .. '.vim'
   unlet b:current_syntax
-
-  syn region  contextMPGraphic  matchgroup=contextBlockDelim
-                                \ start='\\start\z(MP\%(clip\|code\|definitions\|drawing\|environment\|extensions\|inclusions\|initializations\|page\|\)\)\>.*$'
-                                \ end='\\stop\z1'
-                                \ contains=@mpTop,@NoSpell
-  syn region  contextMPGraphic  matchgroup=contextBlockDelim
-                                \ start='\\start\z(\%(\%[re]usable\|use\|unique\|static\)MPgraphic\|staticMPfigure\|uniqueMPpagegraphic\)\>.*$'
-                                \ end='\\stop\z1'
-                                \ contains=@mpTop,@NoSpell
-endif
-
-if get(b:, 'context_lua', get(g:, 'context_lua', 1))
-  syn include @luaTop          syntax/lua.vim
-  unlet b:current_syntax
-
-  syn region  contextLuaCode    matchgroup=contextBlockDelim
-                                \ start='\\startluacode\>'
-                                \ end='\\stopluacode\>' keepend
-                                \ contains=@luaTop,@NoSpell
-
-  syn match   contextDirectLua  "\\\%(directlua\|ctxlua\)\>\%(\s*%.*$\)\="
-                                \ nextgroup=contextBeginEndLua skipwhite skipempty
-                                \ contains=initexComment
-  syn region  contextBeginEndLua matchgroup=contextSpecial
-                                \ start="{" end="}" skip="\\[{}]"
-                                \ contained contains=@luaTop,@NoSpell
-endif
-
-for synname in keys(s:context_include)
-  execute 'syn include @' . synname . 'Top' 'syntax/' . synname . '.vim'
-  unlet b:current_syntax
-  execute 'syn region context' . s:context_include[synname] . 'Code'
+  execute 'syn region context' .. context_include[synname] .. 'Code'
         \ 'matchgroup=contextBlockDelim'
-        \ 'start=+\\start' . s:context_include[synname] . '+'
-        \ 'end=+\\stop' . s:context_include[synname] . '+'
-        \ 'contains=@' . synname . 'Top,@NoSpell'
+        \ 'start=+\\start' .. context_include[synname] .. '\w*+'
+        \ 'end=+\\stop' .. context_include[synname] .. '\w*+'
+        \ 'contains=@' .. synname .. 'Top,@NoSpell'
 endfor
 
-syn match   contextSectioning '\\\%(start\|stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>'
-                              \ contains=@NoSpell
+syn match   contextSectioning '\\\%(start\|stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>' contains=@NoSpell
 
-syn match   contextSpecial    '\\crlf\>\|\\par\>\|-\{2,3}\||[<>/]\=|'
-                              \ contains=@NoSpell
+syn match   contextSpecial    '\\par\>\|-\{2,3}\||[<>/]\=|'                     contains=@NoSpell
 syn match   contextSpecial    /\\[`'"]/
-syn match   contextSpecial    +\\char\%(\d\{1,3}\|'\o\{1,3}\|"\x\{1,2}\)\>+
-                              \ contains=@NoSpell
+syn match   contextSpecial    +\\char\%(\d\{1,3}\|'\o\{1,3}\|"\x\{1,2}\)\>+     contains=@NoSpell
 syn match   contextSpecial    '\^\^.'
 syn match   contextSpecial    '`\%(\\.\|\^\^.\|.\)'
 
-syn match   contextStyle      '\\\%(em\|ss\|hw\|cg\|mf\)\>'
-                              \ contains=@NoSpell
-syn match   contextFont       '\\\%(CAP\|Cap\|cap\|Caps\|kap\|nocap\)\>'
-                              \ contains=@NoSpell
-syn match   contextFont       '\\\%(Word\|WORD\|Words\|WORDS\)\>'
-                              \ contains=@NoSpell
-syn match   contextFont       '\\\%(vi\{1,3}\|ix\|xi\{0,2}\)\>'
-                              \ contains=@NoSpell
-syn match   contextFont       '\\\%(tf\|b[si]\|s[cl]\|os\)\%(xx\|[xabcd]\)\=\>'
-                              \ contains=@NoSpell
+syn match   contextStyle      '\\\%(em\|ss\|hw\|cg\|mf\)\>'                     contains=@NoSpell
+syn match   contextFont       '\\\%(CAP\|Cap\|cap\|Caps\|kap\|nocap\)\>'        contains=@NoSpell
+syn match   contextFont       '\\\%(Word\|WORD\|Words\|WORDS\)\>'               contains=@NoSpell
+syn match   contextFont       '\\\%(vi\{1,3}\|ix\|xi\{0,2}\)\>'                 contains=@NoSpell
+syn match   contextFont       '\\\%(tf\|b[si]\|s[cl]\|os\)\%(xx\|[xabcd]\)\=\>' contains=@NoSpell
 
-hi def link contextOptions    Typedef
-hi def link contextComment    Comment
 hi def link contextBlockDelim Keyword
 hi def link contextBuiltin    Keyword
+hi def link contextCommand    Keyword
+hi def link contextComment    Comment
 hi def link contextDelimiter  Delimiter
+hi def link contextDirectLua  Keyword
 hi def link contextEscaped    String
+hi def link contextFont       contextType
+hi def link contextKeyword    Keyword
+hi def link contextInlineMath String
+hi def link contextMagicLine  PreProc
+hi def link contextMathCmd    Identifier
+hi def link contextMathDelim  Delimiter
+hi def link contextOptions    Typedef
 hi def link contextPreProc    PreProc
 hi def link contextSectioning PreProc
+hi def link contextSequence   Identifier
 hi def link contextSpecial    Special
-hi def link contextType       Type
 hi def link contextStyle      contextType
-hi def link contextFont       contextType
-hi def link contextDirectLua  Keyword
+hi def link contextTodo       Todo
+hi def link contextType       Type
 
-let b:current_syntax = "context"
+b:current_syntax = 'context'
 
-let &cpo = s:cpo_save
-unlet s:cpo_save
+# vim: sw=2 fdm=marker