From 4f3dacf55f36d4f7b68ab0387adc6441fadf8d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Yngve=20Lerv=C3=A5g?= Date: Fri, 12 Jul 2024 23:37:30 +0200 Subject: [PATCH 1/9] perf(syntax): Combine different syntax rules for the same identifier merged rules include: texMathCmdStyle, texMathDelim, texCmdStyle, texCmdPackage, texCmdRef, some rules for amsTeX, texSpecialChar, texCmdRef, texCmdPart this results in a ~20% speedup --- autoload/vimtex/syntax/core.vim | 130 ++++++++----------------- autoload/vimtex/syntax/p/amsmath.vim | 16 +-- autoload/vimtex/syntax/p/cleveref.vim | 2 +- autoload/vimtex/syntax/p/mathtools.vim | 18 ++-- 4 files changed, 64 insertions(+), 102 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index 659dc871d00..10bcb9af937 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -62,8 +62,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " E.g.: \$ \& \% \# \{ \} \_ \S \P syntax match texSpecialChar "\~" - syntax match texSpecialChar "\\ " - syntax match texSpecialChar "\\[$&%#{}_@,;:!>]" + syntax match texSpecialChar "\\[ $&%#{}_@,;:!>]" syntax match texSpecialChar "\\[SP@]\ze[^a-zA-Z@]" syntax match texSpecialChar "\^\^\%(\S\|[0-9a-f]\{2}\)" @@ -150,61 +149,37 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 syntax match texCmdBib nextgroup=texFilesArg skipwhite skipnl "\\bibliography\>" syntax match texCmdBib nextgroup=texFileArg skipwhite skipnl "\\bibliographystyle\>" syntax match texCmdClass nextgroup=texFileOpt,texFileArg skipwhite skipnl "\\document\%(class\|style\)\>" - syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\\usepackage\>" - syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\\RequirePackage\>" - syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\\ProvidesPackage\>" + syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\v\\(usepackage|RequirePackage|ProvidesPackage)>" call vimtex#syntax#core#new_arg('texFileArg', {'contains': '@NoSpell,texCmd,texComment'}) call vimtex#syntax#core#new_arg('texFilesArg', {'contains': '@NoSpell,texCmd,texComment,texOptSep'}) call vimtex#syntax#core#new_opt('texFileOpt', {'next': 'texFileArg'}) call vimtex#syntax#core#new_opt('texFilesOpt', {'next': 'texFilesArg'}) " LaTeX 2.09 type styles - syntax match texCmdStyle "\\rm\>" - syntax match texCmdStyle "\\em\>" - syntax match texCmdStyle "\\bf\>" - syntax match texCmdStyle "\\it\>" - syntax match texCmdStyle "\\sl\>" - syntax match texCmdStyle "\\sf\>" - syntax match texCmdStyle "\\sc\>" - syntax match texCmdStyle "\\tt\>" + + syntax match texCmdStyle "\v\\%(rm|em|bf|it|s[cfl]|tt)>" " LaTeX2E type styles - syntax match texCmdStyle "\\textbf\>" - syntax match texCmdStyle "\\textit\>" - syntax match texCmdStyle "\\textmd\>" - syntax match texCmdStyle "\\textrm\>" - syntax match texCmdStyle "\\texts[cfl]\>" - syntax match texCmdStyle "\\texttt\>" - syntax match texCmdStyle "\\textup\>" - syntax match texCmdStyle "\\textnormal\>" - syntax match texCmdStyle "\\emph\>" - - syntax match texCmdStyle "\\rmfamily\>" - syntax match texCmdStyle "\\sffamily\>" - syntax match texCmdStyle "\\ttfamily\>" - - syntax match texCmdStyle "\\itshape\>" - syntax match texCmdStyle "\\scshape\>" - syntax match texCmdStyle "\\slshape\>" - syntax match texCmdStyle "\\upshape\>" - - syntax match texCmdStyle "\\bfseries\>" - syntax match texCmdStyle "\\mdseries\>" + + syntax match texCmdStyle "\v\\%( + \text%(bf|it|md|rm|s[cfl]|tt|up|normal) + \|emph + \|%(rm|sf|tt)family + \|%(it|sc|sl|up)shape + \|%(bf|md)series + \)>" " Bold and italic commands call s:match_bold_italic() " Type sizes - syntax match texCmdSize "\\tiny\>" - syntax match texCmdSize "\\scriptsize\>" - syntax match texCmdSize "\\footnotesize\>" - syntax match texCmdSize "\\small\>" - syntax match texCmdSize "\\normalsize\>" - syntax match texCmdSize "\\large\>" - syntax match texCmdSize "\\Large\>" - syntax match texCmdSize "\\LARGE\>" - syntax match texCmdSize "\\huge\>" - syntax match texCmdSize "\\Huge\>" + syntax match texCmdSize "\v\\%( + \tiny + \|%(script|footnote|normal)size + \|small + \|[lL]arge|LARGE + \|[hH]uge + \)>" " \newcommand syntax match texCmdNewcmd "\\\%(re\)\?newcommand\>\*\?" @@ -254,12 +229,13 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 syntax match texLetArgEqual contained nextgroup=texLetArgBody skipwhite skipnl "=" " Reference and cite commands - syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\\nocite\>" - syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\\label\>" - syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\\\(page\|eq\)ref\>" - syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\\v\?ref\>" - syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite\>" - syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite[tp]\>\*\?" + syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\v\\%( + \nocite + \|label + \|%(page|eq|v)?ref + \)>" + + syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\v\\cite%(>|[tp]>\*?)" call vimtex#syntax#core#new_opt('texRefOpt', {'next': 'texRefOpt,texRefArg'}) call vimtex#syntax#core#new_arg('texRefArg', {'contains': 'texComment,@NoSpell'}) @@ -274,11 +250,11 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " Sections and parts syntax match texCmdPart "\\\(front\|main\|back\)matter\>" - syntax match texCmdPart "\\part\>" nextgroup=texPartArgTitle - syntax match texCmdPart "\\chapter\>\*\?" nextgroup=texPartArgTitle - syntax match texCmdPart "\v\\%(sub)*section>\*?" nextgroup=texPartArgTitle - syntax match texCmdPart "\v\\%(sub)?paragraph>" nextgroup=texPartArgTitle - syntax match texCmdPart "\v\\add%(part|chap|sec)>\*?" nextgroup=texPartArgTitle + syntax match texCmdPart "\v\\%( + \%(part|%(sub)?paragraph)> + \|%(%(sub)*section|chapter)>\*? + \)" + \ nextgroup=texPartArgTitle call vimtex#syntax#core#new_arg('texPartArgTitle') " Item elements in lists @@ -612,15 +588,8 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texMathTextArg') " Math style commands - syntax match texMathCmdStyle contained "\\mathbb\>" - syntax match texMathCmdStyle contained "\\mathbf\>" - syntax match texMathCmdStyle contained "\\mathcal\>" - syntax match texMathCmdStyle contained "\\mathfrak\>" - syntax match texMathCmdStyle contained "\\mathit\>" - syntax match texMathCmdStyle contained "\\mathnormal\>" - syntax match texMathCmdStyle contained "\\mathrm\>" - syntax match texMathCmdStyle contained "\\mathsf\>" - syntax match texMathCmdStyle contained "\\mathtt\>" + syntax match texMathCmdStyle contained "\v\\math(bb|bf|cal|frak|it|normal|rm|sf|tt)>" + " Bold and italic commands call s:match_bold_italic_math() @@ -1974,32 +1943,17 @@ endfunction " }}}1 function! s:match_math_delims() abort " {{{1 - syntax match texMathDelimMod contained "\\\(left\|right\)\>" + syntax match texMathDelimMod contained "\\\%(left\|right\)\>" syntax match texMathDelimMod contained "\\[bB]igg\?[lr]\?\>" syntax match texMathDelim contained "[()[\]]" - syntax match texMathDelim contained "\\{" - syntax match texMathDelim contained "\\}" - syntax match texMathDelim contained "\\backslash\>" - syntax match texMathDelim contained "\\downarrow\>" - syntax match texMathDelim contained "\\Downarrow\>" - syntax match texMathDelim contained "\\[lr]vert\>" - syntax match texMathDelim contained "\\[lr]Vert\>" - syntax match texMathDelim contained "\\langle\>" - syntax match texMathDelim contained "\\lbrace\>" - syntax match texMathDelim contained "\\lceil\>" - syntax match texMathDelim contained "\\lfloor\>" - syntax match texMathDelim contained "\\lgroup\>" - syntax match texMathDelim contained "\\lmoustache\>" - syntax match texMathDelim contained "\\rangle\>" - syntax match texMathDelim contained "\\rbrace\>" - syntax match texMathDelim contained "\\rceil\>" - syntax match texMathDelim contained "\\rfloor\>" - syntax match texMathDelim contained "\\rgroup\>" - syntax match texMathDelim contained "\\rmoustache\>" - syntax match texMathDelim contained "\\uparrow\>" - syntax match texMathDelim contained "\\Uparrow\>" - syntax match texMathDelim contained "\\updownarrow\>" - syntax match texMathDelim contained "\\Updownarrow\>" + syntax match texMathDelim contained "\\[{}]" + + syntax match texMathDelim contained "\v\\%( + \[lr]%(vert|angle|brace|ceil|floor|group|moustache) + \|backslash + \|[uU]%(down)?parrow + \|[dD]ownarrow + \)>" if !g:vimtex_syntax_conceal.math_delimiters || &encoding !=# 'utf-8' return diff --git a/autoload/vimtex/syntax/p/amsmath.vim b/autoload/vimtex/syntax/p/amsmath.vim index 8e23ae7f16e..49eef487366 100644 --- a/autoload/vimtex/syntax/p/amsmath.vim +++ b/autoload/vimtex/syntax/p/amsmath.vim @@ -29,12 +29,16 @@ function! vimtex#syntax#p#amsmath#load(cfg) abort " {{{1 \ 'math': v:true \}) - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\\begin{subarray}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\\begin{x\?alignat\*\?}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\\begin{xxalignat}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{subarray}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{x\?alignat\*\?}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{xxalignat}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\v\\begin\{%( + \subarray + \|x?alignat\*? + \|xxalignat + \)\}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\v\\end\{%( + \subarray + \|x?alignat\*? + \|xxalignat + \)\}" " \numberwithin syntax match texCmdNumberWithin "\\numberwithin\>" diff --git a/autoload/vimtex/syntax/p/cleveref.vim b/autoload/vimtex/syntax/p/cleveref.vim index eb3ec956a6e..4052116823e 100644 --- a/autoload/vimtex/syntax/p/cleveref.vim +++ b/autoload/vimtex/syntax/p/cleveref.vim @@ -13,7 +13,7 @@ function! vimtex#syntax#p#cleveref#load(cfg) abort " {{{1 " \crefrange, \cpagerefrange (these commands expect two arguments) syntax match texCmdCRef nextgroup=texCRefRangeArg skipwhite skipnl - \ "\\c\(page\)\?refrange\>" + \ "\\c\%(page\)\?refrange\>" " \label[xxx]{asd} syntax match texCmdCRef nextgroup=texCRefOpt,texRefArg skipwhite skipnl diff --git a/autoload/vimtex/syntax/p/mathtools.vim b/autoload/vimtex/syntax/p/mathtools.vim index 1e029d3a4dd..3ec27baaced 100644 --- a/autoload/vimtex/syntax/p/mathtools.vim +++ b/autoload/vimtex/syntax/p/mathtools.vim @@ -15,14 +15,18 @@ function! vimtex#syntax#p#mathtools#load(cfg) abort " {{{1 endif " Support for various environments with option groups - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\\begin{aligned}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\\begin{[lr]gathered}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\\begin{[pbBvV]\?\%(small\)\?matrix\*}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\v\\begin\{%( + \aligned + \|[lr]gathered + \|[pbBvV]?%(small)?matrix\* + \)\}" syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos2 "\\begin{multlined}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{aligned}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{[lr]gathered}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{[pbBvV]\?\%(small\)\?matrix\*}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{multlined}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\v\\end\{%( + \aligned + \|[lr]gathered + \|[pbBvV]?%(small)?matrix\* + \|multlined + \)\}" call vimtex#syntax#core#new_opt('texMathToolsOptPos1', {'contains': ''}) call vimtex#syntax#core#new_opt('texMathToolsOptPos2', {'contains': '', 'next': 'texMathToolsOptWidth'}) call vimtex#syntax#core#new_opt('texMathToolsOptWidth', {'contains': 'texLength'}) From 2fd34cad3eb099c22dc05e6527605d2a7e6fc3a5 Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Mon, 15 Jul 2024 18:51:57 +0800 Subject: [PATCH 2/9] perf(syntax): only create one big `texMathEnvBgnEnd` and `texMathZoneEnv` rule (also only one `texMathError` rule for un-matched `\end`s) This results in a ~9% speedup. Unfortunately I had to restrict funcionality a bit, it is no longer possible to specify predicates when using `new_env` with `{'math': v:true}` --- autoload/vimtex/syntax/core.vim | 74 +++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index 10bcb9af937..b1e5a514fb3 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -568,8 +568,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texMathZoneEnsured', {'contains': '@texClusterMath'}) " Bad/Mismatched math - syntax match texMathError "\\[\])]" - syntax match texMathError "\\end\s*{\s*\(array\|[bBpvV]matrix\|split\|smallmatrix\)\s*}" + syntax match texMathError "\%#=1\\[\])]" " Operators and similar syntax match texMathOper "[-+=/<>|]" contained @@ -1149,6 +1148,9 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 endfunction " }}}1 +let s:custom_math_envs = [] +let s:std_math_envs = 'array\|[bBpvV]matrix\|split\|smallmatrix' +let s:custom_math_envs_by_next = {} function! vimtex#syntax#core#new_env(cfg) abort " {{{1 let l:cfg = extend({ \ 'name': '', @@ -1176,21 +1178,57 @@ function! vimtex#syntax#core#new_env(cfg) abort " {{{1 let l:env_name = l:cfg.name . (l:cfg.starred ? '\*\?' : '') if l:cfg.math + if ! empty(cfg.__predicate) + throw 'predicates are not supported for math environments' + endif + let l:cfg.region = 'texMathZoneEnv' let l:options = 'keepend' - let l:contains = 'contains=texMathEnvBgnEnd,@texClusterMath' let l:next = '' if !empty(l:cfg.math_nextgroup) let l:next = 'nextgroup=' . l:cfg.math_nextgroup . ' skipwhite skipnl' endif - execute 'syntax match texMathEnvBgnEnd' - \ '"\\\%(begin\|end\){' . l:env_name . '}"' - \ 'contained contains=texCmdMathEnv' - \ l:next - execute 'syntax match texMathError "\\end{' . l:env_name . '}"' + if has_key(s:custom_math_envs_by_next, l:next) + let s:custom_math_envs_by_next[l:next] += [l:env_name] + syntax clear texMathEnvBgnEnd + for [l:i_next, l:envs] in items(s:custom_math_envs_by_next) + execute 'syntax match texMathEnvBgnEnd' + \ '"\\\%(begin\|end\){\%(' . join(l:envs, '\|') . '\)}"' + \ 'contained contains=texCmdMathEnv' + \ l:i_next + endfor + else + let s:custom_math_envs_by_next[l:next] = [l:env_name] + execute 'syntax match texMathEnvBgnEnd' + \ '"\\\%(begin\|end\){' . l:env_name . '}"' + \ 'contained contains=texCmdMathEnv' + \ l:next + endif + let l:contains = 'contains=texMathEnvBgnEnd,@texClusterMath' + + if ! empty(s:custom_math_envs) + syntax clear texMathError + syntax clear texMathZoneEnv + endif + let s:custom_math_envs += [l:env_name] + execute 'syntax match texMathError "\\\%()\|]\|end{\%(' + \ . join(s:custom_math_envs, '\|') + \ . '\|' . s:std_math_envs + \ . '\)}\)"' + + execute 'syntax region texMathZoneEnv' + \ 'start="\\begin{\z(' . join(s:custom_math_envs, '\|') . '\)}"' + \ 'end="\\end{\z1}"' + \ 'contains=texMathEnvBgnEnd,@texClusterMath' + \ 'keepend' + else + if l:cfg.region == 'texMathZoneEnv' + throw "use {'math': 1} to define new texMathZoneEnv regions" + endif + if empty(l:cfg.region) let l:cfg.region = printf( \ 'tex%sZone', @@ -1218,18 +1256,18 @@ function! vimtex#syntax#core#new_env(cfg) abort " {{{1 execute 'highlight def link' l:cfg.region 'texZone' endif endif - endif - let l:start = '\\begin{\z(' . l:env_name .'\)}' - if !empty(l:cfg.__predicate) - let l:start .= '\s*\[\_[^\]]\{-}' . l:cfg.__predicate . '\_[^\]]\{-}\]' - endif + let l:start = '\\begin{\z(' . l:env_name .'\)}' + if !empty(l:cfg.__predicate) + let l:start .= '\s*\[\_[^\]]\{-}' . l:cfg.__predicate . '\_[^\]]\{-}\]' + endif - execute 'syntax region' l:cfg.region - \ 'start="' . l:start . '"' - \ 'end="\\end{\z1}"' - \ l:contains - \ l:options + execute 'syntax region' l:cfg.region + \ 'start="' . l:start . '"' + \ 'end="\\end{\z1}"' + \ l:contains + \ l:options + endif endfunction " }}}1 From e8a63ae37c4b3b0f89faed2ed017f9804d7e4154 Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Thu, 18 Jul 2024 16:42:52 +0800 Subject: [PATCH 3/9] perf(syntax): Rewrite skip regexes `:syntime report` shows that the "skip" rules for `texMathZoneTI` and `texMathGroup` are very expensive. The change might speed things up a bit because every non-backslash character only needs to be looked at once. According to `:syntime report` this reduces the time spent on the `texMathZoneTI` skip rule from 3.1% to 2.7%, and similar for texMathGroup. Also change other skip rules of the form `\\\|\\`. Overall, this leads to a ~1% speedup. --- autoload/vimtex/syntax/core.vim | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index b1e5a514fb3..d825ca2d5da 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -549,7 +549,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ l:conceal execute 'syntax region texMathZoneTI matchgroup=texMathDelimZoneTI' \ 'start="\$"' - \ 'skip="\\\\\|\\\$"' + \ 'skip="\\[\\\$]"' \ 'end="\$"' \ 'contains=@texClusterMath' \ 'nextgroup=texMathTextAfter' @@ -907,7 +907,7 @@ endfunction function! vimtex#syntax#core#new_arg(grp, ...) abort " {{{1 let l:cfg = extend({ \ 'contains': 'TOP,@NoSpell', - \ 'matcher': 'start="{" skip="\\\\\|\\}" end="}"', + \ 'matcher': 'start="{" skip="\\[\\\}]" end="}"', \ 'next': '', \ 'matchgroup': 'matchgroup=texDelim', \ 'opts': 'contained', @@ -934,7 +934,7 @@ function! vimtex#syntax#core#new_opt(grp, ...) abort " {{{1 execute 'syntax region' a:grp \ 'contained matchgroup=texDelim' - \ 'start="\[" skip="\\\\\|\\\]" end="\]"' + \ 'start="\[" skip="\\[\\\]]" end="\]"' \ l:cfg.opts \ (empty(l:cfg.contains) ? '' : 'contains=' . l:cfg.contains) \ (empty(l:cfg.next) ? '' : 'nextgroup=' . l:cfg.next . ' skipwhite skipnl') @@ -1101,7 +1101,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_close) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_close - \ 'start="{" skip="\\\\\|\\}" end="}"' + \ 'start="{" skip="\\[\\\}]" end="}"' \ 'contained contains=' . l:contains else execute 'syntax region' l:group_arg1 @@ -1109,7 +1109,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_mid) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_mid - \ 'start="{" skip="\\\\\|\\}" end="}"' + \ 'start="{" skip="\\[\\\}]" end="}"' \ 'contained contains=' . l:contains \ 'skipwhite nextgroup=' . l:group_arg2 @@ -1118,7 +1118,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_close) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_close - \ 'start="{" skip="\\\\\|\\}" end="}"' + \ 'start="{" skip="\\[\\\}]" end="}"' \ 'contained contains=' . l:contains endif From 2df1b490d39082e53325efa5595004ed1b88bb1e Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Fri, 19 Jul 2024 11:54:28 +0800 Subject: [PATCH 4/9] perf(syntax): Re-order math syntax rules Re-order means change the order in which they are checked. Most importantly, (using the `_texMathBackslash` rule) we try to make the syntax engine check syntax rules for commands first when we find a backslash (instead of looking for things like `[(){}+-=]` etc.) This leads to a ~5% speedup. This is definitely suboptimal, because it's one more syntax rule, when we could in theory just move the definitions of ``` texComment, texSpecialChar, texMathSymbol, texCmdGreek, texTabularChar, texCmdEnvM, texCmdFootnote, texCmdMinipage, texCmdParbox, texCmdRef, texCmdSize, texCmdStyle, texCmdTodo, texCmdVerb, texMathCmd, texMathCmdEnv, texMathCmdStyle, texMathCmdStyleBold, texMathCmdStyleItal, texMathCmdText, texMathDelimMod, texMathSymbol, ``` to the bottom of `vimtex#syntax#core#init_rules()` to get the same effect. --- autoload/vimtex/syntax/core.vim | 67 +++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index d825ca2d5da..c30dd7aed94 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -8,6 +8,10 @@ scriptencoding utf-8 function! vimtex#syntax#core#init_rules() abort " {{{1 + " Operators and similar + syntax match texMathOper "[-+=/<>|]" contained + syntax match texMathSuperSub "[_^]" contained + syntax match texMathDelim contained "[()[\]]" " {{{2 Define main syntax clusters syntax cluster texClusterOpt contains= @@ -20,33 +24,21 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \texOptSep, \@NoSpell + " texSpecialChar needs to be included because of "~" + " texTabularChar needs to be included because of "&" + " texCmdGreek and texMathSymbol need to be included because of unicode syntax cluster texClusterMath contains= - \texCmdEnvM, - \texCmdFootnote, - \texCmdGreek, - \texCmdMinipage, - \texCmdParbox, - \texCmdRef, - \texCmdSize, - \texCmdStyle, - \texCmdTodo, - \texCmdVerb, \texComment, \texGroupError, - \texMathCmd, - \texMathCmdEnv, - \texMathCmdStyle, - \texMathCmdStyleBold, - \texMathCmdStyleItal, - \texMathCmdText, \texMathDelim, - \texMathDelimMod, \texMathGroup, \texMathOper, \texMathSuperSub, - \texMathSymbol, \texSpecialChar, + \texCmdGreek, + \texMathSymbol, \texTabularChar, + \_texMathBackslash, \@NoSpell " }}}2 @@ -235,7 +227,8 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \|%(page|eq|v)?ref \)>" - syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\v\\cite%(>|[tp]>\*?)" + syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite\>" + syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite[tp]\>\*\?" call vimtex#syntax#core#new_opt('texRefOpt', {'next': 'texRefOpt,texRefArg'}) call vimtex#syntax#core#new_arg('texRefArg', {'contains': 'texComment,@NoSpell'}) @@ -568,11 +561,8 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texMathZoneEnsured', {'contains': '@texClusterMath'}) " Bad/Mismatched math - syntax match texMathError "\%#=1\\[\])]" + syntax match texMathError "\\[\])]" - " Operators and similar - syntax match texMathOper "[-+=/<>|]" contained - syntax match texMathSuperSub "[_^]" contained " Text Inside Math regions for l:re_cmd in [ @@ -667,6 +657,36 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " }}}2 let b:current_syntax = 'tex' + + " note: texCmdGreek and texMathSymbol also need to be included again + " in texClusterMath because of unicode + " texComment needs to be included here because of \iffalse + " texSpecialChar, texTabularChar and texMathDelim also appear in both lists + syntax match _texMathBackslash "\\"me=e-1 contained nextgroup= + \texComment, + \texSpecialChar, + \texCmdGreek, + \texMathSymbol, + \texTabularChar, + \texCmdEnvM, + \texCmdFootnote, + \texCmdMinipage, + \texCmdParbox, + \texCmdRef, + \texCmdSize, + \texCmdStyle, + \texCmdTodo, + \texCmdVerb, + \texMathCmd, + \texMathCmdEnv, + \texMathCmdStyle, + \texMathCmdStyleBold, + \texMathCmdStyleItal, + \texMathCmdText, + \texMathDelimMod, + \texMathDelim, + \@NoSpell + endfunction " }}}1 @@ -1983,7 +2003,6 @@ endfunction function! s:match_math_delims() abort " {{{1 syntax match texMathDelimMod contained "\\\%(left\|right\)\>" syntax match texMathDelimMod contained "\\[bB]igg\?[lr]\?\>" - syntax match texMathDelim contained "[()[\]]" syntax match texMathDelim contained "\\[{}]" syntax match texMathDelim contained "\v\\%( From 1681fde91fd914cbff9eb60dcace06f1c39f680b Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Sun, 29 Sep 2024 13:43:12 -0700 Subject: [PATCH 5/9] feat(syntax): only create one syntax rule for custom theorems This leads to a ~1.5% speedup. --- autoload/vimtex/syntax/core.vim | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index c30dd7aed94..531c735d113 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -695,12 +695,10 @@ function! vimtex#syntax#core#init_post() abort " {{{1 let b:vimtex_syntax_did_postinit = 1 " Add texTheoremEnvBgn for custom theorems - for l:envname in s:gather_newtheorems() - execute 'syntax match texTheoremEnvBgn' - \ printf('"\\begin{%s}"', l:envname) - \ 'nextgroup=texTheoremEnvOpt skipwhite skipnl' - \ 'contains=texCmdEnv' - endfor + execute 'syntax match texTheoremEnvBgn' + \ '"\%#=1\\begin{\%(' .. join(s:gather_newtheorems(), '\|') ..'\)}"' + \ 'nextgroup=texTheoremEnvOpt skipwhite skipnl' + \ 'contains=texCmdEnv' call vimtex#syntax#packages#init() endfunction From 7751feac3531a2acb19c011e61d345f5478c16ee Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Sun, 29 Sep 2024 13:43:51 -0700 Subject: [PATCH 6/9] perf(syntax): use regex engine 1 for most rules this leads to a massive speedup for most regexes that aren't just literal strings (and some slowdown for matching strings, so we don't force engine 1 for those regexes). Overall, this leads to a ~23% speedup. --- autoload/vimtex/syntax/core.vim | 539 ++++++++++++------------- autoload/vimtex/syntax/p/amsmath.vim | 16 +- autoload/vimtex/syntax/p/amssymb.vim | 406 +++++++++---------- autoload/vimtex/syntax/p/mathtools.vim | 4 +- 4 files changed, 482 insertions(+), 483 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index 531c735d113..bd257851237 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -9,9 +9,9 @@ scriptencoding utf-8 function! vimtex#syntax#core#init_rules() abort " {{{1 " Operators and similar - syntax match texMathOper "[-+=/<>|]" contained - syntax match texMathSuperSub "[_^]" contained - syntax match texMathDelim contained "[()[\]]" + syntax match texMathOper "\%#=1[-+=/<>|]" contained + syntax match texMathSuperSub "\%#=1[_^]" contained + syntax match texMathDelim contained "\%#=1[()[\]]" " {{{2 Define main syntax clusters syntax cluster texClusterOpt contains= @@ -54,11 +54,11 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " E.g.: \$ \& \% \# \{ \} \_ \S \P syntax match texSpecialChar "\~" - syntax match texSpecialChar "\\[ $&%#{}_@,;:!>]" - syntax match texSpecialChar "\\[SP@]\ze[^a-zA-Z@]" - syntax match texSpecialChar "\^\^\%(\S\|[0-9a-f]\{2}\)" + syntax match texSpecialChar "\%#=1\\[ $&%#{}_@,;:!>]" + syntax match texSpecialChar "\%#=1\\[SP@]\ze[^a-zA-Z@]" + syntax match texSpecialChar "\%#=1\^\^\%(\S\|[0-9a-f]\{2}\)" - syntax match texError "[_^]" + syntax match texError "\%#=1[_^]" " }}}2 " {{{2 Commands: general @@ -75,27 +75,27 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 syntax match texOptSep contained ",\s*" " TeX Lengths (matched in options and some arguments) - syntax match texLength contained "\<\d\+\([.,]\d\+\)\?\s*\(true\)\?\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>" + syntax match texLength contained "\%#=1\<\d\+\([.,]\d\+\)\?\s*\(true\)\?\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>" " Match general commands first - syntax match texCmd nextgroup=texOpt,texArg skipwhite skipnl "\\[a-zA-Z@]\+" + syntax match texCmd nextgroup=texOpt,texArg skipwhite skipnl "\%#=1\\[a-zA-Z@]\+" call vimtex#syntax#core#new_opt('texOpt', {'next': 'texArg'}) call vimtex#syntax#core#new_arg('texArg', {'next': 'texArg', 'opts': 'contained transparent'}) " Define separate "generic" commands inside math regions " Note: Defined here because order matters! - syntax match texMathCmd contained nextgroup=texMathArg skipwhite skipnl "\\\a\+" + syntax match texMathCmd contained nextgroup=texMathArg skipwhite skipnl "\%#=1\\\a\+" call vimtex#syntax#core#new_arg('texMathArg', {'contains': '@texClusterMath'}) " {{{2 Commands: core set " Accents and ligatures - syntax match texCmdAccent "\\[bcdvuH]$" - syntax match texCmdAccent "\\[bcdvuH]\ze[^a-zA-Z@]" - syntax match texCmdAccent /\\[=^.~"`']/ - syntax match texCmdAccent /\\['=t'.c^ud"vb~Hr]{\a}/ - syntax match texCmdLigature "\v\\%([ijolL]|ae|oe|ss|AA|AE|OE)$" - syntax match texCmdLigature "\v\\%([ijolL]|ae|oe|ss|AA|AE|OE)\ze[^a-zA-Z@]" + syntax match texCmdAccent "\%#=1\\[bcdvuH]$" + syntax match texCmdAccent "\%#=1\\[bcdvuH]\ze[^a-zA-Z@]" + syntax match texCmdAccent /\%#=1\\[=^.~"`']/ + syntax match texCmdAccent /\%#=1\\['=t'.c^ud"vb~Hr]{\a}/ + syntax match texCmdLigature "\%#=1\v\\%([ijolL]|ae|oe|ss|AA|AE|OE)$" + syntax match texCmdLigature "\%#=1\v\\%([ijolL]|ae|oe|ss|AA|AE|OE)\ze[^a-zA-Z@]" " Spacecodes (TeX'isms) " * See e.g. https://en.wikibooks.org/wiki/TeX/catcode @@ -104,44 +104,44 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " * \sfcode`\) = 0 " * \uccode`X = `X " * \lccode`x = `x - syntax match texCmdSpaceCode "\v\\%(math|cat|del|lc|sf|uc)code`"me=e-1 + syntax match texCmdSpaceCode "\%#=1\v\\%(math|cat|del|lc|sf|uc)code`"me=e-1 \ nextgroup=texCmdSpaceCodeChar - syntax match texCmdSpaceCodeChar "\v`\\?.%(\^.)?\?%(\d|\"\x{1,6}|`.)" contained + syntax match texCmdSpaceCodeChar "\%#=1\v`\\?.%(\^.)?\?%(\d|\"\x{1,6}|`.)" contained " Todo commands - syntax match texCmdTodo '\\todo\w*' + syntax match texCmdTodo "\%#=1\\todo\w*" " \author - syntax match texCmdAuthor nextgroup=texAuthorOpt,texAuthorArg skipwhite skipnl "\\author\>" + syntax match texCmdAuthor nextgroup=texAuthorOpt,texAuthorArg skipwhite skipnl "\%#=1\\author\>" call vimtex#syntax#core#new_opt('texAuthorOpt', {'next': 'texAuthorArg'}) call vimtex#syntax#core#new_arg('texAuthorArg', {'contains': 'TOP,@Spell'}) " \title - syntax match texCmdTitle nextgroup=texTitleArg skipwhite skipnl "\\title\>" + syntax match texCmdTitle nextgroup=texTitleArg skipwhite skipnl "\%#=1\\title\>" call vimtex#syntax#core#new_arg('texTitleArg') " \footnote - syntax match texCmdFootnote nextgroup=texFootnoteArg skipwhite skipnl "\\footnote\>" + syntax match texCmdFootnote nextgroup=texFootnoteArg skipwhite skipnl "\%#=1\\footnote\>" call vimtex#syntax#core#new_arg('texFootnoteArg') " \if \else \fi - syntax match texCmdConditional nextgroup=texConditionalArg skipwhite skipnl "\\\(if[a-zA-Z@]\+\|fi\|else\)\>" + syntax match texCmdConditional nextgroup=texConditionalArg skipwhite skipnl "\%#=1\\\(if[a-zA-Z@]\+\|fi\|else\)\>" call vimtex#syntax#core#new_arg('texConditionalArg') " \@ifnextchar - syntax match texCmdConditionalINC "\\\w*@ifnextchar\>" + syntax match texCmdConditionalINC "\%#=1\\\w*@ifnextchar\>" \ nextgroup=texConditionalINCChar skipwhite skipnl syntax match texConditionalINCChar "\S" contained " Various commands that take a file argument (or similar) - syntax match texCmdInput nextgroup=texFileArg skipwhite skipnl "\\input\>" - syntax match texCmdInput nextgroup=texFileArg skipwhite skipnl "\\include\>" - syntax match texCmdInput nextgroup=texFilesArg skipwhite skipnl "\\includeonly\>" - syntax match texCmdInput nextgroup=texFileOpt,texFileArg skipwhite skipnl "\\includegraphics\>" - syntax match texCmdBib nextgroup=texFilesArg skipwhite skipnl "\\bibliography\>" - syntax match texCmdBib nextgroup=texFileArg skipwhite skipnl "\\bibliographystyle\>" - syntax match texCmdClass nextgroup=texFileOpt,texFileArg skipwhite skipnl "\\document\%(class\|style\)\>" - syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\v\\(usepackage|RequirePackage|ProvidesPackage)>" + syntax match texCmdInput nextgroup=texFileArg skipwhite skipnl "\%#=1\\input\>" + syntax match texCmdInput nextgroup=texFileArg skipwhite skipnl "\%#=1\\include\>" + syntax match texCmdInput nextgroup=texFilesArg skipwhite skipnl "\%#=1\\includeonly\>" + syntax match texCmdInput nextgroup=texFileOpt,texFileArg skipwhite skipnl "\%#=1\\includegraphics\>" + syntax match texCmdBib nextgroup=texFilesArg skipwhite skipnl "\%#=1\\bibliography\>" + syntax match texCmdBib nextgroup=texFileArg skipwhite skipnl "\%#=1\\bibliographystyle\>" + syntax match texCmdClass nextgroup=texFileOpt,texFileArg skipwhite skipnl "\%#=1\\document\%(class\|style\)\>" + syntax match texCmdPackage nextgroup=texFilesOpt,texFilesArg skipwhite skipnl "\%#=1\v\\(usepackage|RequirePackage|ProvidesPackage)>" call vimtex#syntax#core#new_arg('texFileArg', {'contains': '@NoSpell,texCmd,texComment'}) call vimtex#syntax#core#new_arg('texFilesArg', {'contains': '@NoSpell,texCmd,texComment,texOptSep'}) call vimtex#syntax#core#new_opt('texFileOpt', {'next': 'texFileArg'}) @@ -149,11 +149,11 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " LaTeX 2.09 type styles - syntax match texCmdStyle "\v\\%(rm|em|bf|it|s[cfl]|tt)>" + syntax match texCmdStyle "\%#=1\v\\%(rm|em|bf|it|s[cfl]|tt)>" " LaTeX2E type styles - syntax match texCmdStyle "\v\\%( + syntax match texCmdStyle "\%#=1\v\\%( \text%(bf|it|md|rm|s[cfl]|tt|up|normal) \|emph \|%(rm|sf|tt)family @@ -165,7 +165,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call s:match_bold_italic() " Type sizes - syntax match texCmdSize "\v\\%( + syntax match texCmdSize "\%#=1\v\\%( \tiny \|%(script|footnote|normal)size \|small @@ -174,9 +174,9 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \)>" " \newcommand - syntax match texCmdNewcmd "\\\%(re\)\?newcommand\>\*\?" + syntax match texCmdNewcmd "\%#=1\\\%(re\)\?newcommand\>\*\?" \ nextgroup=texNewcmdArgName skipwhite skipnl - syntax match texNewcmdArgName "\\[a-zA-Z@]\+" + syntax match texNewcmdArgName "\%#=1\\[a-zA-Z@]\+" \ nextgroup=texNewcmdOpt,texNewcmdArgBody skipwhite skipnl \ contained call vimtex#syntax#core#new_arg('texNewcmdArgName', { @@ -188,10 +188,10 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ 'opts': 'oneline', \}) call vimtex#syntax#core#new_arg('texNewcmdArgBody') - syntax match texNewcmdParm contained "#\+\d" containedin=texNewcmdArgBody + syntax match texNewcmdParm contained "#\+\d" containedin=texNewcmdArgBody " regexp=2 seems to be faster " \newenvironment - syntax match texCmdNewenv nextgroup=texNewenvArgName skipwhite skipnl "\\\%(re\)\?newenvironment\>" + syntax match texCmdNewenv nextgroup=texNewenvArgName skipwhite skipnl "\%#=1\\\%(re\)\?newenvironment\>" call vimtex#syntax#core#new_arg('texNewenvArgName', {'next': 'texNewenvArgBegin,texNewenvOpt'}) call vimtex#syntax#core#new_opt('texNewenvOpt', { \ 'next': 'texNewenvArgBegin,texNewenvOpt', @@ -203,37 +203,36 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " Definitions/Commands " E.g. \def \foo #1#2 {foo #1 bar #2 baz} - syntax match texCmdDef "\\def\>" nextgroup=texDefArgName skipwhite skipnl - syntax match texDefArgName contained nextgroup=texDefParmPre,texDefArgBody skipwhite skipnl "\\[a-zA-Z@]\+" - syntax match texDefArgName contained nextgroup=texDefParmPre,texDefArgBody skipwhite skipnl "\\[^a-zA-Z@]" + syntax match texCmdDef "\%#=1\\def\>" nextgroup=texDefArgName skipwhite skipnl + syntax match texDefArgName contained nextgroup=texDefParmPre,texDefArgBody skipwhite skipnl "\%#=1\\[a-zA-Z@]\+" + syntax match texDefArgName contained nextgroup=texDefParmPre,texDefArgBody skipwhite skipnl "\%#=1\\[^a-zA-Z@]" syntax match texDefParmPre contained nextgroup=texDefArgBody skipwhite skipnl "#[^{]*" syntax match texDefParm contained "#\+\d" containedin=texDefParmPre,texDefArgBody call vimtex#syntax#core#new_arg('texDefArgBody') " \let - syntax match texCmdLet "\\let\>" nextgroup=texLetArgName skipwhite skipnl - syntax match texLetArgName contained nextgroup=texLetArgBody,texLetArgEqual skipwhite skipnl "\\[a-zA-Z@]\+" - syntax match texLetArgName contained nextgroup=texLetArgBody,texLetArgEqual skipwhite skipnl "\\[^a-zA-Z@]" + syntax match texCmdLet "\%#=1\\let\>" nextgroup=texLetArgName skipwhite skipnl + syntax match texLetArgName contained nextgroup=texLetArgBody,texLetArgEqual skipwhite skipnl "\%#=1\\[a-zA-Z@]\+" + syntax match texLetArgName contained nextgroup=texLetArgBody,texLetArgEqual skipwhite skipnl "\%#=1\\[^a-zA-Z@]" " Note: define texLetArgEqual after texLetArgBody; order matters " E.g. in '\let\eq==' we want: 1st = is texLetArgEqual, 2nd = is texLetArgBody " Reversing lines results in: 1st = is texLetArgBody, 2nd = is unmatched - syntax match texLetArgBody contained "\\[a-zA-Z@]\+\|\\[^a-zA-Z@]\|\S" contains=TOP,@Nospell + syntax match texLetArgBody contained "\%#=1\\[a-zA-Z@]\+\|\\[^a-zA-Z@]\|\S" contains=TOP,@Nospell syntax match texLetArgEqual contained nextgroup=texLetArgBody skipwhite skipnl "=" " Reference and cite commands - syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\v\\%( + syntax match texCmdRef nextgroup=texRefArg skipwhite skipnl "\%#=1\v\\%( \nocite \|label \|%(page|eq|v)?ref \)>" - syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite\>" - syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\\cite[tp]\>\*\?" + syntax match texCmdRef nextgroup=texRefOpt,texRefArg skipwhite skipnl "\%#=1\v\\cite%(>|[tp]>\*?)" call vimtex#syntax#core#new_opt('texRefOpt', {'next': 'texRefOpt,texRefArg'}) call vimtex#syntax#core#new_arg('texRefArg', {'contains': 'texComment,@NoSpell'}) " \bibitem[label]{marker} - syntax match texCmdBibitem "\\bibitem\>" + syntax match texCmdBibitem "\%#=1\\bibitem\>" \ nextgroup=texBibitemOpt,texBibitemArg skipwhite skipnl call vimtex#syntax#core#new_opt('texBibitemOpt', { \ 'next': 'texBibitemArg' @@ -242,8 +241,8 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ {'contains': 'texComment,@NoSpell'}) " Sections and parts - syntax match texCmdPart "\\\(front\|main\|back\)matter\>" - syntax match texCmdPart "\v\\%( + syntax match texCmdPart "\%#=1\\\(front\|main\|back\)matter\>" + syntax match texCmdPart "\%#=1\v\\%( \%(part|%(sub)?paragraph)> \|%(%(sub)*section|chapter)>\*? \)" @@ -251,11 +250,11 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texPartArgTitle') " Item elements in lists - syntax match texCmdItem "\\item\>" nextgroup=texItemLabel + syntax match texCmdItem "\%#=1\\item\>" nextgroup=texItemLabel call vimtex#syntax#core#new_opt('texItemLabel') " \begin \end environments - syntax match texCmdEnv "\v\\%(begin|end)>" nextgroup=texEnvArgName + syntax match texCmdEnv "\%#=1\v\\%(begin|end)>" nextgroup=texEnvArgName call vimtex#syntax#core#new_arg('texEnvArgName', { \ 'contains': 'texComment,@NoSpell', \ 'next': 'texEnvOpt', @@ -314,14 +313,14 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \}) " These are also used inside \parbox options - syntax match texBoxOptPosVal "[bcmt]" contained - syntax match texBoxOptIPosVal "[bcst]" contained + syntax match texBoxOptPosVal "\%#=1[bcmt]" contained + syntax match texBoxOptIPosVal "\%#=1[bcst]" contained " {{{2 Commands: \parbox[position][height][inner-pos]{width}{contents} " Reference: http://latexref.xyz/_005cparbox.html - syntax match texCmdParbox "\\parbox\>" + syntax match texCmdParbox "\%#=1\\parbox\>" \ skipwhite skipnl \ nextgroup=texParboxOptPos,texParboxArgWidth @@ -350,7 +349,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " https://texdoc.org/serve/latex2e/0 " \newtheorem - syntax match texCmdNewthm "\\newtheorem\>" + syntax match texCmdNewthm "\%#=1\\newtheorem\>" \ nextgroup=texNewthmArgName skipwhite skipnl call vimtex#syntax#core#new_arg('texNewthmArgName', { \ 'next': 'texNewthmOptCounter,texNewthmArgPrinted', @@ -379,22 +378,22 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " * For more info on dtx files, see e.g. " https://ctan.uib.no/info/dtxtut/dtxtut.pdf if expand('%:e') ==# 'dtx' - syntax match texComment "\^\^A.*$" - syntax match texComment "^%\+" + syntax match texComment "\%#=1\^\^A.*$" + syntax match texComment "\%#=1^%\+" elseif g:vimtex_syntax_nospell_comments - syntax match texComment "%.*$" contains=@NoSpell + syntax match texComment "\%#=1%.*$" contains=@NoSpell else - syntax match texComment "%.*$" contains=@Spell + syntax match texComment "\%#=1%.*$" contains=@Spell endif " Don't spell check magic comments/directives - syntax match texComment "^\s*%\s*!.*" contains=@NoSpell + syntax match texComment "\%#=1^\s*%\s*!.*" contains=@NoSpell " Do not check URLs and acronyms in comments " Source: https://github.com/lervag/vimtex/issues/562 - syntax match texCommentURL "\w\+:\/\/[^[:space:]]\+" + syntax match texCommentURL "\%#=1\w\+:\/\/[^[:space:]]\+" \ containedin=texComment contained contains=@NoSpell - syntax match texCommentAcronym '\v<(\u|\d){3,}s?>' + syntax match texCommentAcronym "\%#=1\v<(\u|\d){3,}s?>" \ containedin=texComment contained contains=@NoSpell " Todo and similar within comments @@ -407,28 +406,28 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " Highlight \iffalse ... \fi blocks as comments syntax region texComment matchgroup=texCmdConditional - \ start="^\s*\\iffalse\>" end="\\\%(fi\|else\)\>" + \ start="\%#=1^\s*\\iffalse\>" end="\%#=1\\\%(fi\|else\)\>" \ contains=texCommentConditionals syntax region texCommentConditionals matchgroup=texComment - \ start="\\if\w\+" end="\\fi\>" + \ start="\%#=1\\if\w\+" end="\%#=1\\fi\>" \ contained transparent contains=NONE - syntax match texCommentConditionals "\\iff\>" + syntax match texCommentConditionals "\%#=1\\iff\>" \ contained transparent contains=NONE " Highlight \iftrue ... \else ... \fi blocks as comments syntax region texConditionalTrueZone matchgroup=texCmdConditional - \ start="^\s*\\iftrue\>" end="\v\\fi>|%(\\else>)@=" + \ start="\%#=1^\s*\\iftrue\>" end="\%#=1\v\\fi>|%(\\else>)@=" \ contains=TOP nextgroup=texCommentFalse \ transparent syntax region texConditionalNested matchgroup=texCmdConditional - \ start="\\if\w\+" end="\\fi\>" + \ start="\%#=1\\if\w\+" end="\%#=1\\fi\>" \ contained contains=TOP \ containedin=texConditionalTrueZone,texConditionalNested syntax region texCommentFalse matchgroup=texCmdConditional - \ start="\\else\>" end="\\fi\>" + \ start="\%#=1\\else\>" end="\%#=1\\fi\>" \ contained contains=texCommentConditionals " }}}2 @@ -441,18 +440,18 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \}) " Verbatim inline - syntax match texCmdVerb "\\verb\>\*\?" nextgroup=texVerbZoneInline + syntax match texCmdVerb "\%#=1\\verb\>\*\?" nextgroup=texVerbZoneInline call vimtex#syntax#core#new_arg('texVerbZoneInline', { \ 'contains': '', - \ 'matcher': 'start="\z([^\ta-zA-Z]\)" end="\z1"' + \ 'matcher': 'start="\%#=1\z([^\ta-zA-Z]\)" end="\z1"' \}) " }}}2 " {{{2 Zone: Expl3 syntax region texE3Zone matchgroup=texCmdE3 - \ start="\\\%(ExplSyntaxOn\|ProvidesExpl\%(Package\|Class\|File\)\)" - \ end="\\ExplSyntaxOff\|\%$" + \ start="\%#=1\\\%(ExplSyntaxOn\|ProvidesExpl\%(Package\|Class\|File\)\)" + \ end="\%#=1\\ExplSyntaxOff\|\%$" \ transparent \ contains=TOP,@NoSpell @@ -492,14 +491,14 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texMathGroup', {'contains': '@texClusterMath'}) " Define math environment boundaries - syntax match texCmdMathEnv "\v\\%(begin|end)>" contained nextgroup=texMathEnvArgName + syntax match texCmdMathEnv "\%#=1\v\\%(begin|end)>" contained nextgroup=texMathEnvArgName call vimtex#syntax#core#new_arg('texMathEnvArgName', \ {'contains': 'texComment,@NoSpell'}) " Environments inside math zones " * This is used to restrict the whitespace between environment name and " the option group (see https://github.com/lervag/vimtex/issues/2043). - syntax match texCmdEnvM "\v\\%(begin|end)>" contained nextgroup=texEnvMArgName + syntax match texCmdEnvM "\%#=1\v\\%(begin|end)>" contained nextgroup=texEnvMArgName call vimtex#syntax#core#new_arg('texEnvMArgName', { \ 'contains': 'texComment,@NoSpell', \ 'next': 'texEnvOpt', @@ -542,7 +541,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ l:conceal execute 'syntax region texMathZoneTI matchgroup=texMathDelimZoneTI' \ 'start="\$"' - \ 'skip="\\[\\\$]"' + \ 'skip="\%#=1\\[\\\$]"' \ 'end="\$"' \ 'contains=@texClusterMath' \ 'nextgroup=texMathTextAfter' @@ -554,14 +553,14 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ l:conceal " This is to disable spell check for text just after "$" (e.g. "$n$th") - syntax match texMathTextAfter "\w\+" contained contains=@NoSpell + syntax match texMathTextAfter "\%#=1\w\+" contained contains=@NoSpell " Math regions: \ensuremath{...} - syntax match texCmdMath "\\ensuremath\>" nextgroup=texMathZoneEnsured + syntax match texCmdMath "\%#=1\\ensuremath\>" nextgroup=texMathZoneEnsured call vimtex#syntax#core#new_arg('texMathZoneEnsured', {'contains': '@texClusterMath'}) " Bad/Mismatched math - syntax match texMathError "\\[\])]" + syntax match texMathError "\%#=1\\[\])]" " Text Inside Math regions @@ -571,22 +570,22 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ '[mf]box', \] execute 'syntax match texMathCmdText' - \ '"\v\\' . l:re_cmd . '>"' + \ '"\%#=1\v\\' . l:re_cmd . '>"' \ 'contained skipwhite nextgroup=texMathTextArg' endfor call vimtex#syntax#core#new_arg('texMathTextArg') " Math style commands - syntax match texMathCmdStyle contained "\v\\math(bb|bf|cal|frak|it|normal|rm|sf|tt)>" + syntax match texMathCmdStyle contained "\%#=1\v\\math(bb|bf|cal|frak|it|normal|rm|sf|tt)>" " Bold and italic commands call s:match_bold_italic_math() " Support for array environment - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\begin{array}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\%#=1\\begin{array}" \ nextgroup=texMathArrayArg skipwhite skipnl - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\\end{array}" + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\%#=1\\end{array}" call vimtex#syntax#core#new_arg('texMathArrayArg', { \ 'contains': '@texClusterTabular' \}) @@ -601,15 +600,15 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " {{{2 Zone: SynIgnore syntax region texSynIgnoreZone matchgroup=texComment - \ start="^\c\s*% VimTeX: SynIgnore\%( on\| enable\)\?\s*$" - \ end="^\c\s*% VimTeX: SynIgnore\%( off\| disable\).*" + \ start="\%#=1^\c\s*% VimTeX: SynIgnore\%( on\| enable\)\?\s*$" + \ end="\%#=1^\c\s*% VimTeX: SynIgnore\%( off\| disable\).*" \ contains=texComment,texCmd " Also support Overleafs magic comment " https://www.overleaf.com/learn/how-to/Code_Check syntax region texSynIgnoreZone matchgroup=texComment - \ start="^%%begin novalidate\s*$" - \ end="^%%end novalidate\s*$" + \ start="\%#=1^%%begin novalidate\s*$" + \ end="\%#=1^%%end novalidate\s*$" \ contains=texComment,texCmd " }}}2 @@ -925,7 +924,7 @@ endfunction function! vimtex#syntax#core#new_arg(grp, ...) abort " {{{1 let l:cfg = extend({ \ 'contains': 'TOP,@NoSpell', - \ 'matcher': 'start="{" skip="\\[\\\}]" end="}"', + \ 'matcher': 'start="{" skip="\%#=1\\[\\\}]" end="}"', \ 'next': '', \ 'matchgroup': 'matchgroup=texDelim', \ 'opts': 'contained', @@ -952,7 +951,7 @@ function! vimtex#syntax#core#new_opt(grp, ...) abort " {{{1 execute 'syntax region' a:grp \ 'contained matchgroup=texDelim' - \ 'start="\[" skip="\\[\\\]]" end="\]"' + \ 'start="\[" skip="\%#=1\\[\\\]]" end="\]"' \ l:cfg.opts \ (empty(l:cfg.contains) ? '' : 'contains=' . l:cfg.contains) \ (empty(l:cfg.next) ? '' : 'nextgroup=' . l:cfg.next . ' skipwhite skipnl') @@ -1119,7 +1118,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_close) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_close - \ 'start="{" skip="\\[\\\}]" end="}"' + \ 'start="{" skip="\%#=1\\[\\\}]" end="}"' \ 'contained contains=' . l:contains else execute 'syntax region' l:group_arg1 @@ -1127,7 +1126,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_mid) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_mid - \ 'start="{" skip="\\[\\\}]" end="}"' + \ 'start="{" skip="\%#=1\\[\\\}]" end="}"' \ 'contained contains=' . l:contains \ 'skipwhite nextgroup=' . l:group_arg2 @@ -1136,7 +1135,7 @@ function! vimtex#syntax#core#new_cmd_with_concealed_delims(cfg) abort " {{{1 \ empty(l:cfg.cchar_close) \ ? 'concealends' \ : 'concealends cchar=' . l:cfg.cchar_close - \ 'start="{" skip="\\[\\\}]" end="}"' + \ 'start="{" skip="\%#=1\\[\\\}]" end="}"' \ 'contained contains=' . l:contains endif @@ -1213,14 +1212,14 @@ function! vimtex#syntax#core#new_env(cfg) abort " {{{1 syntax clear texMathEnvBgnEnd for [l:i_next, l:envs] in items(s:custom_math_envs_by_next) execute 'syntax match texMathEnvBgnEnd' - \ '"\\\%(begin\|end\){\%(' . join(l:envs, '\|') . '\)}"' + \ '"\%#=1\\\%(begin\|end\){\%(' . join(l:envs, '\|') . '\)}"' \ 'contained contains=texCmdMathEnv' \ l:i_next endfor else let s:custom_math_envs_by_next[l:next] = [l:env_name] execute 'syntax match texMathEnvBgnEnd' - \ '"\\\%(begin\|end\){' . l:env_name . '}"' + \ '"\%#=1\\\%(begin\|end\){' . l:env_name . '}"' \ 'contained contains=texCmdMathEnv' \ l:next endif @@ -1231,13 +1230,13 @@ function! vimtex#syntax#core#new_env(cfg) abort " {{{1 syntax clear texMathZoneEnv endif let s:custom_math_envs += [l:env_name] - execute 'syntax match texMathError "\\\%()\|]\|end{\%(' + execute 'syntax match texMathError "\%#=1\\\%()\|]\|end{\%(' \ . join(s:custom_math_envs, '\|') \ . '\|' . s:std_math_envs \ . '\)}\)"' execute 'syntax region texMathZoneEnv' - \ 'start="\\begin{\z(' . join(s:custom_math_envs, '\|') . '\)}"' + \ 'start="\%#=1\\begin{\z(' . join(s:custom_math_envs, '\|') . '\)}"' \ 'end="\\end{\z1}"' \ 'contains=texMathEnvBgnEnd,@texClusterMath' \ 'keepend' @@ -1293,7 +1292,7 @@ endfunction function! vimtex#syntax#core#conceal_cmd_pairs(cmd, pairs) abort " {{{1 for [l:from, l:to] in a:pairs execute 'syntax match texMathSymbol' - \ '"\\' . a:cmd . '\%({\s*' . l:from . '\s*}\|\s\+' . l:from . '\)"' + \ '"\%#=1\\' . a:cmd . '\%({\s*' . l:from . '\s*}\|\s\+' . l:from . '\)"' \ 'contained conceal cchar=' . l:to endfor endfunction @@ -1326,7 +1325,7 @@ function! s:match_bold_italic() abort " {{{1 \ ['texCmdStyleItal', 'textit'], \ ['texCmdStyleItal', 'textsl'], \] - execute 'syntax match' l:group '"\\' . l:pattern . '\>"' + execute 'syntax match' l:group '"\%#=1\\' . l:pattern . '\>"' \ 'skipwhite skipnl nextgroup=' . l:map[l:group] \ l:conceal endfor @@ -1336,7 +1335,7 @@ function! s:match_bold_italic() abort " {{{1 execute 'syntax region texStyleBoth matchgroup=texDelim start="{" end="}" contained contains=@texClusterItalBold' l:concealends if g:vimtex_syntax_conceal.styles - syntax match texCmdStyle "\v\\text%(rm|tt|up|normal|sf|sc)>" + syntax match texCmdStyle "\%#=1\v\\text%(rm|tt|up|normal|sf|sc)>" \ conceal skipwhite skipnl nextgroup=texStyleArgConc syntax region texStyleArgConc matchgroup=texDelim start="{" end="}" \ contained contains=TOP,@NoSpell concealends @@ -1358,7 +1357,7 @@ function! s:match_bold_italic_math() abort " {{{1 \ ['texMathCmdStyleBold', 'mathbf'], \ ['texMathCmdStyleItal', 'mathit'], \] - execute 'syntax match' l:group '"\\' . l:pattern . '\>"' + execute 'syntax match' l:group '"\%#=1\\' . l:pattern . '\>"' \ 'contained skipwhite nextgroup=' . l:map[l:group] \ l:conceal endfor @@ -1367,7 +1366,7 @@ function! s:match_bold_italic_math() abort " {{{1 execute 'syntax region texMathStyleItal matchgroup=texDelim start="{" end="}" contained contains=@texClusterMath' l:concealends if g:vimtex_syntax_conceal.styles - syntax match texMathCmdStyle "\v\\math%(rm|tt|normal|sf)>" + syntax match texMathCmdStyle "\%#=1\v\\math%(rm|tt|normal|sf)>" \ contained conceal skipwhite nextgroup=texMathStyleConcArg syntax region texMathStyleConcArg matchgroup=texDelim start="{" end="}" \ contained contains=@texClusterMath concealends @@ -1558,13 +1557,13 @@ function! s:match_math_symbols() abort " {{{1 " Many of these symbols were contributed by Björn Winckler if !g:vimtex_syntax_conceal.math_symbols | return | endif - syntax match texMathSymbol '\\|' contained conceal cchar=‖ - syntax match texMathSymbol '\\sqrt\[3]' contained conceal cchar=∛ - syntax match texMathSymbol '\\sqrt\[4]' contained conceal cchar=∜ + syntax match texMathSymbol "\\|" contained conceal cchar=‖ + syntax match texMathSymbol "\\sqrt\[3]" contained conceal cchar=∛ + syntax match texMathSymbol "\\sqrt\[4]" contained conceal cchar=∜ for [l:cmd, l:symbol] in s:cmd_symbols execute 'syntax match texMathSymbol' - \ '"\\' . l:cmd . '\ze\%(\>\|[_^]\)"' + \ '"\%#=1\\' . l:cmd . '\ze\%(\>\|[_^]\)"' \ 'contained conceal cchar=' . l:symbol endfor @@ -1981,29 +1980,29 @@ let s:cmd_pairs_dict = { function! s:match_math_fracs() abort " {{{1 if !g:vimtex_syntax_conceal.math_fracs | return | endif - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(2\|{2}\)' contained conceal cchar=½ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(3\|{3}\)' contained conceal cchar=⅓ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(2\|{2}\)\s*\%(3\|{3}\)' contained conceal cchar=⅔ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(4\|{4}\)' contained conceal cchar=¼ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(5\|{5}\)' contained conceal cchar=⅕ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(2\|{2}\)\s*\%(5\|{5}\)' contained conceal cchar=⅖ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(3\|{3}\)\s*\%(5\|{5}\)' contained conceal cchar=⅗ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(4\|{4}\)\s*\%(5\|{5}\)' contained conceal cchar=⅘ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(6\|{6}\)' contained conceal cchar=⅙ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(5\|{5}\)\s*\%(6\|{6}\)' contained conceal cchar=⅚ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(8\|{8}\)' contained conceal cchar=⅛ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(3\|{3}\)\s*\%(8\|{8}\)' contained conceal cchar=⅜ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(5\|{5}\)\s*\%(8\|{8}\)' contained conceal cchar=⅝ - syntax match texMathSymbol '\\[dt]\?frac\s*\%(7\|{7}\)\s*\%(8\|{8}\)' contained conceal cchar=⅞ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(2\|{2}\)" contained conceal cchar=½ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(3\|{3}\)" contained conceal cchar=⅓ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(2\|{2}\)\s*\%(3\|{3}\)" contained conceal cchar=⅔ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(4\|{4}\)" contained conceal cchar=¼ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(5\|{5}\)" contained conceal cchar=⅕ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(2\|{2}\)\s*\%(5\|{5}\)" contained conceal cchar=⅖ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(3\|{3}\)\s*\%(5\|{5}\)" contained conceal cchar=⅗ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(4\|{4}\)\s*\%(5\|{5}\)" contained conceal cchar=⅘ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(6\|{6}\)" contained conceal cchar=⅙ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(5\|{5}\)\s*\%(6\|{6}\)" contained conceal cchar=⅚ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(1\|{1}\)\s*\%(8\|{8}\)" contained conceal cchar=⅛ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(3\|{3}\)\s*\%(8\|{8}\)" contained conceal cchar=⅜ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(5\|{5}\)\s*\%(8\|{8}\)" contained conceal cchar=⅝ + syntax match texMathSymbol "\%#=1\\[dt]\?frac\s*\%(7\|{7}\)\s*\%(8\|{8}\)" contained conceal cchar=⅞ endfunction " }}}1 function! s:match_math_delims() abort " {{{1 - syntax match texMathDelimMod contained "\\\%(left\|right\)\>" - syntax match texMathDelimMod contained "\\[bB]igg\?[lr]\?\>" - syntax match texMathDelim contained "\\[{}]" + syntax match texMathDelimMod contained "\%#=1\\\%(left\|right\)\>" + syntax match texMathDelimMod contained "\%#=1\\[bB]igg\?[lr]\?\>" + syntax match texMathDelim contained "\%#=1\\[{}]" - syntax match texMathDelim contained "\v\\%( + syntax match texMathDelim contained "\%#=1\v\\%( \[lr]%(vert|angle|brace|ceil|floor|group|moustache) \|backslash \|[uU]%(down)?parrow @@ -2014,69 +2013,69 @@ function! s:match_math_delims() abort " {{{1 return endif - syntax match texMathDelim contained conceal cchar=| "\\left|\s*" - syntax match texMathDelim contained conceal cchar=| "\s*\\right|" - syntax match texMathDelim contained conceal cchar=‖ "\\left\\|\s*" - syntax match texMathDelim contained conceal cchar=‖ "\s*\\right\\|" - syntax match texMathDelim contained conceal cchar=| "\\lvert\>\s*" - syntax match texMathDelim contained conceal cchar=| "\s*\\rvert\>" - syntax match texMathDelim contained conceal cchar=‖ "\\lVert\>\s*" - syntax match texMathDelim contained conceal cchar=‖ "\s*\\rVert\>" - syntax match texMathDelim contained conceal cchar=( "\\left(\s*" - syntax match texMathDelim contained conceal cchar=) "\s*\\right)" - syntax match texMathDelim contained conceal cchar=[ "\\left\[\s*" - syntax match texMathDelim contained conceal cchar=] "\s*\\right]" - syntax match texMathDelim contained conceal cchar={ "\\{\s*" - syntax match texMathDelim contained conceal cchar=} "\s*\\}" - syntax match texMathDelim contained conceal cchar={ "\\left\\{\s*" - syntax match texMathDelim contained conceal cchar=} "\s*\\right\\}" - syntax match texMathDelim contained conceal cchar={ "\\lbrace\>\s*" - syntax match texMathDelim contained conceal cchar=} "\s*\\rbrace\>" - syntax match texMathDelim contained conceal cchar=⟨ "\\langle\>\s*" - syntax match texMathDelim contained conceal cchar=⟩ "\s*\\rangle\>" - syntax match texMathDelim contained conceal cchar=⌊ "\\lfloor\>\s*" - syntax match texMathDelim contained conceal cchar=⌋ "\s*\\rfloor\>" - syntax match texMathDelim contained conceal cchar=< "\\\%([bB]igg\?l\?\|left\)<\s*" - syntax match texMathDelim contained conceal cchar=> "\s*\\\%([bB]igg\?r\?\|right\)>" - syntax match texMathDelim contained conceal cchar=( "\\\%([bB]igg\?l\?\|left\)(\s*" - syntax match texMathDelim contained conceal cchar=) "\s*\\\%([bB]igg\?r\?\|right\))" - syntax match texMathDelim contained conceal cchar=[ "\\\%([bB]igg\?l\?\|left\)\[\s*" - syntax match texMathDelim contained conceal cchar=] "\s*\\\%([bB]igg\?r\?\|right\)]" - syntax match texMathDelim contained conceal cchar={ "\\\%([bB]igg\?l\?\|left\)\\{\s*" - syntax match texMathDelim contained conceal cchar=} "\s*\\\%([bB]igg\?r\?\|right\)\\}" - syntax match texMathDelim contained conceal cchar={ "\\\%([bB]igg\?l\?\|left\)\\lbrace\>\s*" - syntax match texMathDelim contained conceal cchar=} "\s*\\\%([bB]igg\?r\?\|right\)\\rbrace\>" - syntax match texMathDelim contained conceal cchar=⌈ "\\\%([bB]igg\?l\?\|left\)\\lceil\>\s*" - syntax match texMathDelim contained conceal cchar=⌉ "\s*\\\%([bB]igg\?r\?\|right\)\\rceil\>" - syntax match texMathDelim contained conceal cchar=⌊ "\\\%([bB]igg\?l\?\|left\)\\lfloor\>\s*" - syntax match texMathDelim contained conceal cchar=⌋ "\s*\\\%([bB]igg\?r\?\|right\)\\rfloor\>" - syntax match texMathDelim contained conceal cchar=⌊ "\\\%([bB]igg\?l\?\|left\)\\lgroup\>\s*" - syntax match texMathDelim contained conceal cchar=⌋ "\s*\\\%([bB]igg\?r\?\|right\)\\rgroup\>" - syntax match texMathDelim contained conceal cchar=⎛ "\\\%([bB]igg\?l\?\|left\)\\lmoustache\>\s*" - syntax match texMathDelim contained conceal cchar=⎞ "\s*\\\%([bB]igg\?r\?\|right\)\\rmoustache\>" - syntax match texMathDelim contained conceal cchar=| "\\\%([bB]igg\?l\?\|left\)|\s*" - syntax match texMathDelim contained conceal cchar=| "\s*\\\%([bB]igg\?r\?\|right\)|" - syntax match texMathDelim contained conceal cchar=‖ "\\\%([bB]igg\?l\?\|left\|\)\\|\s*" - syntax match texMathDelim contained conceal cchar=‖ "\s*\\\%([bB]igg\?r\?\|right\)\\|" - syntax match texMathDelim contained conceal cchar=↓ "\\\%([bB]igg\?l\?\|left\)\\downarrow\>\s*" - syntax match texMathDelim contained conceal cchar=↓ "\s*\\\%([bB]igg\?r\?\|right\)\\downarrow\>" - syntax match texMathDelim contained conceal cchar=⇓ "\\\%([bB]igg\?l\?\|left\)\\Downarrow\>\s*" - syntax match texMathDelim contained conceal cchar=⇓ "\s*\\\%([bB]igg\?r\?\|right\)\\Downarrow\>" - syntax match texMathDelim contained conceal cchar=↑ "\\\%([bB]igg\?l\?\|left\)\\uparrow\>\s*" - syntax match texMathDelim contained conceal cchar=↑ "\s*\\\%([bB]igg\?r\?\|right\)\\uparrow\>" - syntax match texMathDelim contained conceal cchar=↑ "\\\%([bB]igg\?l\?\|left\)\\Uparrow\>\s*" - syntax match texMathDelim contained conceal cchar=↑ "\s*\\\%([bB]igg\?r\?\|right\)\\Uparrow\>" - syntax match texMathDelim contained conceal cchar=↕ "\\\%([bB]igg\?l\?\|left\)\\updownarrow\>\s*" - syntax match texMathDelim contained conceal cchar=↕ "\s*\\\%([bB]igg\?r\?\|right\)\\updownarrow\>" - syntax match texMathDelim contained conceal cchar=⇕ "\\\%([bB]igg\?l\?\|left\)\\Updownarrow\>\s*" - syntax match texMathDelim contained conceal cchar=⇕ "\s*\\\%([bB]igg\?r\?\|right\)\\Updownarrow\>" + syntax match texMathDelim contained conceal cchar=| "\%#=1\\left|\s*" + syntax match texMathDelim contained conceal cchar=| "\%#=1\s*\\right|" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\\left\\|\s*" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\s*\\right\\|" + syntax match texMathDelim contained conceal cchar=| "\%#=1\\lvert\>\s*" + syntax match texMathDelim contained conceal cchar=| "\%#=1\s*\\rvert\>" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\\lVert\>\s*" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\s*\\rVert\>" + syntax match texMathDelim contained conceal cchar=( "\%#=1\\left(\s*" + syntax match texMathDelim contained conceal cchar=) "\%#=1\s*\\right)" + syntax match texMathDelim contained conceal cchar=[ "\%#=1\\left\[\s*" + syntax match texMathDelim contained conceal cchar=] "\%#=1\s*\\right]" + syntax match texMathDelim contained conceal cchar={ "\%#=1\\{\s*" + syntax match texMathDelim contained conceal cchar=} "\%#=1\s*\\}" + syntax match texMathDelim contained conceal cchar={ "\%#=1\\left\\{\s*" + syntax match texMathDelim contained conceal cchar=} "\%#=1\s*\\right\\}" + syntax match texMathDelim contained conceal cchar={ "\%#=1\\lbrace\>\s*" + syntax match texMathDelim contained conceal cchar=} "\%#=1\s*\\rbrace\>" + syntax match texMathDelim contained conceal cchar=⟨ "\%#=1\\langle\>\s*" + syntax match texMathDelim contained conceal cchar=⟩ "\%#=1\s*\\rangle\>" + syntax match texMathDelim contained conceal cchar=⌊ "\%#=1\\lfloor\>\s*" + syntax match texMathDelim contained conceal cchar=⌋ "\%#=1\s*\\rfloor\>" + syntax match texMathDelim contained conceal cchar=< "\%#=1\\\%([bB]igg\?l\?\|left\)<\s*" + syntax match texMathDelim contained conceal cchar=> "\%#=1\s*\\\%([bB]igg\?r\?\|right\)>" + syntax match texMathDelim contained conceal cchar=( "\%#=1\\\%([bB]igg\?l\?\|left\)(\s*" + syntax match texMathDelim contained conceal cchar=) "\%#=1\s*\\\%([bB]igg\?r\?\|right\))" + syntax match texMathDelim contained conceal cchar=[ "\%#=1\\\%([bB]igg\?l\?\|left\)\[\s*" + syntax match texMathDelim contained conceal cchar=] "\%#=1\s*\\\%([bB]igg\?r\?\|right\)]" + syntax match texMathDelim contained conceal cchar={ "\%#=1\\\%([bB]igg\?l\?\|left\)\\{\s*" + syntax match texMathDelim contained conceal cchar=} "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\}" + syntax match texMathDelim contained conceal cchar={ "\%#=1\\\%([bB]igg\?l\?\|left\)\\lbrace\>\s*" + syntax match texMathDelim contained conceal cchar=} "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rbrace\>" + syntax match texMathDelim contained conceal cchar=⌈ "\%#=1\\\%([bB]igg\?l\?\|left\)\\lceil\>\s*" + syntax match texMathDelim contained conceal cchar=⌉ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rceil\>" + syntax match texMathDelim contained conceal cchar=⌊ "\%#=1\\\%([bB]igg\?l\?\|left\)\\lfloor\>\s*" + syntax match texMathDelim contained conceal cchar=⌋ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rfloor\>" + syntax match texMathDelim contained conceal cchar=⌊ "\%#=1\\\%([bB]igg\?l\?\|left\)\\lgroup\>\s*" + syntax match texMathDelim contained conceal cchar=⌋ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rgroup\>" + syntax match texMathDelim contained conceal cchar=⎛ "\%#=1\\\%([bB]igg\?l\?\|left\)\\lmoustache\>\s*" + syntax match texMathDelim contained conceal cchar=⎞ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rmoustache\>" + syntax match texMathDelim contained conceal cchar=| "\%#=1\\\%([bB]igg\?l\?\|left\)|\s*" + syntax match texMathDelim contained conceal cchar=| "\%#=1\s*\\\%([bB]igg\?r\?\|right\)|" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\\\%([bB]igg\?l\?\|left\|\)\\|\s*" + syntax match texMathDelim contained conceal cchar=‖ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\|" + syntax match texMathDelim contained conceal cchar=↓ "\%#=1\\\%([bB]igg\?l\?\|left\)\\downarrow\>\s*" + syntax match texMathDelim contained conceal cchar=↓ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\downarrow\>" + syntax match texMathDelim contained conceal cchar=⇓ "\%#=1\\\%([bB]igg\?l\?\|left\)\\Downarrow\>\s*" + syntax match texMathDelim contained conceal cchar=⇓ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\Downarrow\>" + syntax match texMathDelim contained conceal cchar=↑ "\%#=1\\\%([bB]igg\?l\?\|left\)\\uparrow\>\s*" + syntax match texMathDelim contained conceal cchar=↑ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\uparrow\>" + syntax match texMathDelim contained conceal cchar=↑ "\%#=1\\\%([bB]igg\?l\?\|left\)\\Uparrow\>\s*" + syntax match texMathDelim contained conceal cchar=↑ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\Uparrow\>" + syntax match texMathDelim contained conceal cchar=↕ "\%#=1\\\%([bB]igg\?l\?\|left\)\\updownarrow\>\s*" + syntax match texMathDelim contained conceal cchar=↕ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\updownarrow\>" + syntax match texMathDelim contained conceal cchar=⇕ "\%#=1\\\%([bB]igg\?l\?\|left\)\\Updownarrow\>\s*" + syntax match texMathDelim contained conceal cchar=⇕ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\Updownarrow\>" if &ambiwidth ==# 'double' - syntax match texMathDelim contained conceal cchar=〈 "\\\%([bB]igg\?l\?\|left\)\\langle\>\s*" - syntax match texMathDelim contained conceal cchar=〉 "\s*\\\%([bB]igg\?r\?\|right\)\\rangle\>" + syntax match texMathDelim contained conceal cchar=〈 "\%#=1\\\%([bB]igg\?l\?\|left\)\\langle\>\s*" + syntax match texMathDelim contained conceal cchar=〉 "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rangle\>" else - syntax match texMathDelim contained conceal cchar=⟨ "\\\%([bB]igg\?l\?\|left\)\\langle\>\s*" - syntax match texMathDelim contained conceal cchar=⟩ "\s*\\\%([bB]igg\?r\?\|right\)\\rangle\>" + syntax match texMathDelim contained conceal cchar=⟨ "\%#=1\\\%([bB]igg\?l\?\|left\)\\langle\>\s*" + syntax match texMathDelim contained conceal cchar=⟩ "\%#=1\s*\\\%([bB]igg\?r\?\|right\)\\rangle\>" endif endfunction @@ -2105,7 +2104,7 @@ function! s:match_conceal_accents() abort " {{{1 let l:accent = s:key_accents[i] let l:re_ws = l:accent =~# '^\\\\\a$' ? '\s\+' : '\s*' let l:re = l:accent . '\%(\s*{' . l:chr . '}\|' . l:re_ws . l:chr . '\)' - execute 'syntax match texCmdAccent /' . l:re . '/' + execute 'syntax match texCmdAccent /\%#=1' . l:re . '/' \ 'conceal cchar=' . l:target endfor endfor @@ -2170,19 +2169,19 @@ let s:map_accents = [ " }}}1 function! s:match_conceal_ligatures() abort " {{{1 - syntax match texCmdLigature "\\lq\>" conceal cchar=‘ - syntax match texCmdLigature "\\rq\>" conceal cchar=′ - syntax match texCmdLigature "\\i\>" conceal cchar=ı - syntax match texCmdLigature "\\j\>" conceal cchar=ȷ - syntax match texCmdLigature "\\AE\>" conceal cchar=Æ - syntax match texCmdLigature "\\ae\>" conceal cchar=æ - syntax match texCmdLigature "\\oe\>" conceal cchar=œ - syntax match texCmdLigature "\\OE\>" conceal cchar=Œ - syntax match texCmdLigature "\\o\>" conceal cchar=ø - syntax match texCmdLigature "\\O\>" conceal cchar=Ø - syntax match texCmdLigature "\\aa\>" conceal cchar=å - syntax match texCmdLigature "\\AA\>" conceal cchar=Å - syntax match texCmdLigature "\\ss\>" conceal cchar=ß + syntax match texCmdLigature "\%#=1\\lq\>" conceal cchar=‘ + syntax match texCmdLigature "\%#=1\\rq\>" conceal cchar=′ + syntax match texCmdLigature "\%#=1\\i\>" conceal cchar=ı + syntax match texCmdLigature "\%#=1\\j\>" conceal cchar=ȷ + syntax match texCmdLigature "\%#=1\\AE\>" conceal cchar=Æ + syntax match texCmdLigature "\%#=1\\ae\>" conceal cchar=æ + syntax match texCmdLigature "\%#=1\\oe\>" conceal cchar=œ + syntax match texCmdLigature "\%#=1\\OE\>" conceal cchar=Œ + syntax match texCmdLigature "\%#=1\\o\>" conceal cchar=ø + syntax match texCmdLigature "\%#=1\\O\>" conceal cchar=Ø + syntax match texCmdLigature "\%#=1\\aa\>" conceal cchar=å + syntax match texCmdLigature "\%#=1\\AA\>" conceal cchar=Å + syntax match texCmdLigature "\%#=1\\ss\>" conceal cchar=ß syntax match texLigature "--" conceal cchar=– syntax match texLigature "---" conceal cchar=— syntax match texLigature "`" conceal cchar=‘ @@ -2196,13 +2195,13 @@ endfunction " }}}1 function! s:match_conceal_fancy() abort " {{{1 - syntax match texCmd '\\colon\>' conceal cchar=: - syntax match texCmd '\\dots\>' conceal cchar=… - syntax match texCmd '\\slash\>' conceal cchar=/ - syntax match texCmd '\\ldots\>' conceal cchar=… - syntax match texTabularChar '\\\\' conceal cchar=⏎ + syntax match texCmd "\%#=1\\colon\>" conceal cchar=: + syntax match texCmd "\%#=1\\dots\>" conceal cchar=… + syntax match texCmd "\%#=1\\slash\>" conceal cchar=/ + syntax match texCmd "\%#=1\\ldots\>" conceal cchar=… + syntax match texTabularChar "\\\\" conceal cchar=⏎ - syntax match texCmdItem '\\item\>' conceal cchar=○ + syntax match texCmdItem "\%#=1\\item\>" conceal cchar=○ \ nextgroup=texItemLabelConcealed syntax match texItemLabelConcealed "\s*\[[^]]*\]" \ contained contains=texItemLabelDelim @@ -2213,33 +2212,33 @@ endfunction " }}}1 function! s:match_conceal_spacing() abort " {{{1 syntax match texSpecialChar "\~" conceal cchar= - syntax match texSpecialChar "\\ " conceal cchar= - syntax match texSpecialChar "\\[,;:!>]" conceal - syntax match texSpecialChar "\\@\ze\s\+" conceal - syntax match texCmd '\\bigskip\>' conceal - syntax match texCmd '\\hfill\>' conceal - syntax match texCmd '\\medspace\>' conceal - syntax match texCmd '\\qquad\>' conceal - syntax match texCmd '\\quad\>' conceal - syntax match texCmd '\\thickspace\>' conceal - syntax match texCmd '\\thinspace\>' conceal - syntax match texCmd '\\vfill\>' conceal - syntax match texCmd "\\[hv]space\>" conceal + syntax match texSpecialChar "\%#=1\\ " conceal cchar= + syntax match texSpecialChar "\%#=1\\[,;:!>]" conceal + syntax match texSpecialChar "\%#=1\\@\ze\s\+" conceal + syntax match texCmd "\%#=1\\bigskip\>" conceal + syntax match texCmd "\%#=1\\hfill\>" conceal + syntax match texCmd "\%#=1\\medspace\>" conceal + syntax match texCmd "\%#=1\\qquad\>" conceal + syntax match texCmd "\%#=1\\quad\>" conceal + syntax match texCmd "\%#=1\\thickspace\>" conceal + syntax match texCmd "\%#=1\\thinspace\>" conceal + syntax match texCmd "\%#=1\\vfill\>" conceal + syntax match texCmd "\%#=1\\[hv]space\>" conceal \ skipwhite nextgroup=texConcealedArg - syntax match texCmd "\\h\?phantom\>" conceal + syntax match texCmd "\%#=1\\h\?phantom\>" conceal \ skipwhite nextgroup=texConcealedArg - syntax match texMathCmd '\\bigskip\>' contained conceal - syntax match texMathCmd '\\hfill\>' contained conceal - syntax match texMathCmd '\\medspace\>' contained conceal - syntax match texMathCmd '\\qquad\>' contained conceal - syntax match texMathCmd '\\quad\>' contained conceal - syntax match texMathCmd '\\thickspace\>' contained conceal - syntax match texMathCmd '\\thinspace\>' contained conceal - syntax match texMathCmd '\\vfill\>' contained conceal - syntax match texMathCmd "\\[hv]space\>" contained conceal + syntax match texMathCmd "\%#=1\\bigskip\>" contained conceal + syntax match texMathCmd "\%#=1\\hfill\>" contained conceal + syntax match texMathCmd "\%#=1\\medspace\>" contained conceal + syntax match texMathCmd "\%#=1\\qquad\>" contained conceal + syntax match texMathCmd "\%#=1\\quad\>" contained conceal + syntax match texMathCmd "\%#=1\\thickspace\>" contained conceal + syntax match texMathCmd "\%#=1\\thinspace\>" contained conceal + syntax match texMathCmd "\%#=1\\vfill\>" contained conceal + syntax match texMathCmd "\%#=1\\[hv]space\>" contained conceal \ skipwhite nextgroup=texConcealedArg - syntax match texMathCmd "\\h\?phantom\>" contained conceal + syntax match texMathCmd "\%#=1\\h\?phantom\>" contained conceal \ skipwhite nextgroup=texConcealedArg call vimtex#syntax#core#new_arg('texConcealedArg', { @@ -2255,47 +2254,47 @@ endfunction " }}}1 function! s:match_conceal_greek() abort " {{{1 - syntax match texCmdGreek "\\alpha\>" contained conceal cchar=α - syntax match texCmdGreek "\\beta\>" contained conceal cchar=β - syntax match texCmdGreek "\\gamma\>" contained conceal cchar=γ - syntax match texCmdGreek "\\delta\>" contained conceal cchar=δ - syntax match texCmdGreek "\\epsilon\>" contained conceal cchar=ϵ - syntax match texCmdGreek "\\varepsilon\>" contained conceal cchar=ε - syntax match texCmdGreek "\\zeta\>" contained conceal cchar=ζ - syntax match texCmdGreek "\\eta\>" contained conceal cchar=η - syntax match texCmdGreek "\\theta\>" contained conceal cchar=θ - syntax match texCmdGreek "\\vartheta\>" contained conceal cchar=ϑ - syntax match texCmdGreek "\\iota\>" contained conceal cchar=ι - syntax match texCmdGreek "\\kappa\>" contained conceal cchar=κ - syntax match texCmdGreek "\\lambda\>" contained conceal cchar=λ - syntax match texCmdGreek "\\mu\>" contained conceal cchar=μ - syntax match texCmdGreek "\\nu\>" contained conceal cchar=ν - syntax match texCmdGreek "\\xi\>" contained conceal cchar=ξ - syntax match texCmdGreek "\\pi\>" contained conceal cchar=π - syntax match texCmdGreek "\\varpi\>" contained conceal cchar=ϖ - syntax match texCmdGreek "\\rho\>" contained conceal cchar=ρ - syntax match texCmdGreek "\\varrho\>" contained conceal cchar=ϱ - syntax match texCmdGreek "\\sigma\>" contained conceal cchar=σ - syntax match texCmdGreek "\\varsigma\>" contained conceal cchar=ς - syntax match texCmdGreek "\\tau\>" contained conceal cchar=τ - syntax match texCmdGreek "\\upsilon\>" contained conceal cchar=υ - syntax match texCmdGreek "\\phi\>" contained conceal cchar=ϕ - syntax match texCmdGreek "\\varphi\>" contained conceal cchar=φ - syntax match texCmdGreek "\\chi\>" contained conceal cchar=χ - syntax match texCmdGreek "\\psi\>" contained conceal cchar=ψ - syntax match texCmdGreek "\\omega\>" contained conceal cchar=ω - syntax match texCmdGreek "\\Gamma\>" contained conceal cchar=Γ - syntax match texCmdGreek "\\Delta\>" contained conceal cchar=Δ - syntax match texCmdGreek "\\Theta\>" contained conceal cchar=Θ - syntax match texCmdGreek "\\Lambda\>" contained conceal cchar=Λ - syntax match texCmdGreek "\\Xi\>" contained conceal cchar=Ξ - syntax match texCmdGreek "\\Pi\>" contained conceal cchar=Π - syntax match texCmdGreek "\\Sigma\>" contained conceal cchar=Σ - syntax match texCmdGreek "\\Upsilon\>" contained conceal cchar=Υ - syntax match texCmdGreek "\\Phi\>" contained conceal cchar=Φ - syntax match texCmdGreek "\\Chi\>" contained conceal cchar=Χ - syntax match texCmdGreek "\\Psi\>" contained conceal cchar=Ψ - syntax match texCmdGreek "\\Omega\>" contained conceal cchar=Ω + syntax match texCmdGreek "\%#=1\\alpha\>" contained conceal cchar=α + syntax match texCmdGreek "\%#=1\\beta\>" contained conceal cchar=β + syntax match texCmdGreek "\%#=1\\gamma\>" contained conceal cchar=γ + syntax match texCmdGreek "\%#=1\\delta\>" contained conceal cchar=δ + syntax match texCmdGreek "\%#=1\\epsilon\>" contained conceal cchar=ϵ + syntax match texCmdGreek "\%#=1\\varepsilon\>" contained conceal cchar=ε + syntax match texCmdGreek "\%#=1\\zeta\>" contained conceal cchar=ζ + syntax match texCmdGreek "\%#=1\\eta\>" contained conceal cchar=η + syntax match texCmdGreek "\%#=1\\theta\>" contained conceal cchar=θ + syntax match texCmdGreek "\%#=1\\vartheta\>" contained conceal cchar=ϑ + syntax match texCmdGreek "\%#=1\\iota\>" contained conceal cchar=ι + syntax match texCmdGreek "\%#=1\\kappa\>" contained conceal cchar=κ + syntax match texCmdGreek "\%#=1\\lambda\>" contained conceal cchar=λ + syntax match texCmdGreek "\%#=1\\mu\>" contained conceal cchar=μ + syntax match texCmdGreek "\%#=1\\nu\>" contained conceal cchar=ν + syntax match texCmdGreek "\%#=1\\xi\>" contained conceal cchar=ξ + syntax match texCmdGreek "\%#=1\\pi\>" contained conceal cchar=π + syntax match texCmdGreek "\%#=1\\varpi\>" contained conceal cchar=ϖ + syntax match texCmdGreek "\%#=1\\rho\>" contained conceal cchar=ρ + syntax match texCmdGreek "\%#=1\\varrho\>" contained conceal cchar=ϱ + syntax match texCmdGreek "\%#=1\\sigma\>" contained conceal cchar=σ + syntax match texCmdGreek "\%#=1\\varsigma\>" contained conceal cchar=ς + syntax match texCmdGreek "\%#=1\\tau\>" contained conceal cchar=τ + syntax match texCmdGreek "\%#=1\\upsilon\>" contained conceal cchar=υ + syntax match texCmdGreek "\%#=1\\phi\>" contained conceal cchar=ϕ + syntax match texCmdGreek "\%#=1\\varphi\>" contained conceal cchar=φ + syntax match texCmdGreek "\%#=1\\chi\>" contained conceal cchar=χ + syntax match texCmdGreek "\%#=1\\psi\>" contained conceal cchar=ψ + syntax match texCmdGreek "\%#=1\\omega\>" contained conceal cchar=ω + syntax match texCmdGreek "\%#=1\\Gamma\>" contained conceal cchar=Γ + syntax match texCmdGreek "\%#=1\\Delta\>" contained conceal cchar=Δ + syntax match texCmdGreek "\%#=1\\Theta\>" contained conceal cchar=Θ + syntax match texCmdGreek "\%#=1\\Lambda\>" contained conceal cchar=Λ + syntax match texCmdGreek "\%#=1\\Xi\>" contained conceal cchar=Ξ + syntax match texCmdGreek "\%#=1\\Pi\>" contained conceal cchar=Π + syntax match texCmdGreek "\%#=1\\Sigma\>" contained conceal cchar=Σ + syntax match texCmdGreek "\%#=1\\Upsilon\>" contained conceal cchar=Υ + syntax match texCmdGreek "\%#=1\\Phi\>" contained conceal cchar=Φ + syntax match texCmdGreek "\%#=1\\Chi\>" contained conceal cchar=Χ + syntax match texCmdGreek "\%#=1\\Psi\>" contained conceal cchar=Ψ + syntax match texCmdGreek "\%#=1\\Omega\>" contained conceal cchar=Ω endfunction " }}}1 @@ -2356,7 +2355,7 @@ endfunction " }}}1 function! s:match_conceal_sections() abort " {{{1 - syntax match texCmdPart "\v\\%(sub)*section>\*?" contains=texPartConcealed nextgroup=texPartConcArgTitle + syntax match texCmdPart "\%#=1\v\\%(sub)*section>\*?" contains=texPartConcealed nextgroup=texPartConcArgTitle syntax match texPartConcealed "\\" contained conceal cchar=# syntax match texPartConcealed "sub" contained conceal cchar=# syntax match texPartConcealed "section\*\?" contained conceal cchar= diff --git a/autoload/vimtex/syntax/p/amsmath.vim b/autoload/vimtex/syntax/p/amsmath.vim index 49eef487366..85c7b51f9ee 100644 --- a/autoload/vimtex/syntax/p/amsmath.vim +++ b/autoload/vimtex/syntax/p/amsmath.vim @@ -29,19 +29,19 @@ function! vimtex#syntax#p#amsmath#load(cfg) abort " {{{1 \ 'math': v:true \}) - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\v\\begin\{%( + syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathArrayArg skipwhite skipnl "\%#=1\v\\begin\{%( \subarray \|x?alignat\*? \|xxalignat \)\}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\v\\end\{%( + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\%#=1\v\\end\{%( \subarray \|x?alignat\*? \|xxalignat \)\}" " \numberwithin - syntax match texCmdNumberWithin "\\numberwithin\>" + syntax match texCmdNumberWithin "\%#=1\\numberwithin\>" \ nextgroup=texNumberWithinArg1 skipwhite skipnl call vimtex#syntax#core#new_arg('texNumberWithinArg1', { \ 'next': 'texNumberWithinArg2', @@ -52,7 +52,7 @@ function! vimtex#syntax#p#amsmath#load(cfg) abort " {{{1 \}) " \subjclass - syntax match texCmdSubjClass "\\subjclass\>" + syntax match texCmdSubjClass "\%#=1\\subjclass\>" \ nextgroup=texSubjClassOpt,texSubjClassArg skipwhite skipnl call vimtex#syntax#core#new_opt('texSubjClassOpt', { \ 'next': 'texSubjClassArg', @@ -63,13 +63,13 @@ function! vimtex#syntax#p#amsmath#load(cfg) abort " {{{1 \}) " \operatorname - syntax match texCmdOpname nextgroup=texOpnameArg skipwhite skipnl "\\operatorname\>" + syntax match texCmdOpname nextgroup=texOpnameArg skipwhite skipnl "\%#=1\\operatorname\>" call vimtex#syntax#core#new_arg('texOpnameArg', { \ 'contains': 'TOP,@Spell' \}) " DeclareMathOperator - syntax match texCmdDeclmathoper nextgroup=texDeclmathoperArgName skipwhite skipnl "\\DeclareMathOperator\>\*\?" + syntax match texCmdDeclmathoper nextgroup=texDeclmathoperArgName skipwhite skipnl "\%#=1\\DeclareMathOperator\>\*\?" call vimtex#syntax#core#new_arg('texDeclmathoperArgName', { \ 'next': 'texDeclmathoperArgBody', \ 'contains': '' @@ -77,7 +77,7 @@ function! vimtex#syntax#p#amsmath#load(cfg) abort " {{{1 call vimtex#syntax#core#new_arg('texDeclmathoperArgBody', {'contains': 'TOP,@Spell'}) " \tag{label} or \tag*{label} - syntax match texMathCmd "\\tag\>\*\?" contained nextgroup=texMathTagArg + syntax match texMathCmd "\%#=1\\tag\>\*\?" contained nextgroup=texMathTagArg call vimtex#syntax#core#new_arg('texMathTagArg', {'contains': 'TOP,@Spell'}) " Add conceal rules @@ -120,7 +120,7 @@ function! s:add_conceals() abort " {{{1 " conceal the command and delims " \operatorname{ … } ⇒ … syntax region texMathConcealedArg contained matchgroup=texMathCmd - \ start="\\operatorname\*\?\s*{\s*" end="\s*}" + \ start="\%#=1\\operatorname\*\?\s*{\s*" end="\s*}" \ concealends syntax cluster texClusterMath add=texMathConcealedArg diff --git a/autoload/vimtex/syntax/p/amssymb.vim b/autoload/vimtex/syntax/p/amssymb.vim index c9c97fc0717..495557be2b0 100644 --- a/autoload/vimtex/syntax/p/amssymb.vim +++ b/autoload/vimtex/syntax/p/amssymb.vim @@ -10,209 +10,209 @@ scriptencoding utf-8 function! vimtex#syntax#p#amssymb#load(cfg) abort " {{{1 if !g:vimtex_syntax_conceal.math_symbols | return | endif - syntax match texMathSymbol '\\Bbbk\>' contained conceal cchar=𝕜 - syntax match texMathSymbol '\\Bumpeq\>' contained conceal cchar=≎ - syntax match texMathSymbol '\\Finv\>' contained conceal cchar=Ⅎ - syntax match texMathSymbol '\\Game\>' contained conceal cchar=⅁ - syntax match texMathSymbol '\\Lleftarrow\>' contained conceal cchar=⇚ - syntax match texMathSymbol '\\Rrightarrow\>' contained conceal cchar=⇛ - syntax match texMathSymbol '\\Subset\>' contained conceal cchar=⋐ - syntax match texMathSymbol '\\Supset\>' contained conceal cchar=⋑ - syntax match texMathSymbol '\\Vdash\>' contained conceal cchar=⊩ - syntax match texMathSymbol '\\Vvdash\>' contained conceal cchar=⊪ - syntax match texMathSymbol '\\approxeq\>' contained conceal cchar=≊ - syntax match texMathSymbol '\\backepsilon\>' contained conceal cchar=∍ - syntax match texMathSymbol '\\backprime\>' contained conceal cchar=‵ - syntax match texMathSymbol '\\backsim\>' contained conceal cchar=∽ - syntax match texMathSymbol '\\backsimeq\>' contained conceal cchar=⋍ - syntax match texMathSymbol '\\barwedge\>' contained conceal cchar=⊼ - syntax match texMathSymbol '\\because\>' contained conceal cchar=∵ - syntax match texMathSymbol '\\beth\>' contained conceal cchar=ℶ - syntax match texMathSymbol '\\between\>' contained conceal cchar=≬ - syntax match texMathSymbol '\\bigstar\>' contained conceal cchar=★ - syntax match texMathSymbol '\\blacklozenge\>' contained conceal cchar=◆ - syntax match texMathSymbol '\\blacksquare\>' contained conceal cchar=■ - syntax match texMathSymbol '\\blacktriangle\>' contained conceal cchar=▲ - syntax match texMathSymbol '\\blacktriangledown\>' contained conceal cchar=▼ - syntax match texMathSymbol '\\blacktriangleleft\>' contained conceal cchar=◀ - syntax match texMathSymbol '\\blacktriangleright\>' contained conceal cchar=▶ - syntax match texMathSymbol '\\boxdot\>' contained conceal cchar=⊡ - syntax match texMathSymbol '\\boxminus\>' contained conceal cchar=⊟ - syntax match texMathSymbol '\\boxplus\>' contained conceal cchar=⊞ - syntax match texMathSymbol '\\boxtimes\>' contained conceal cchar=⊠ - syntax match texMathSymbol '\\bumpeq\>' contained conceal cchar=≏ - syntax match texMathSymbol '\\centerdot\>' contained conceal cchar=⋅ - syntax match texMathSymbol '\\checkmark\>' contained conceal cchar=✓ - syntax match texMathSymbol '\\circeq\>' contained conceal cchar=≗ - syntax match texMathSymbol '\\circlearrowleft\>' contained conceal cchar=↺ - syntax match texMathSymbol '\\circlearrowright\>' contained conceal cchar=↻ - syntax match texMathSymbol '\\circledS\>' contained conceal cchar=Ⓢ - syntax match texMathSymbol '\\circledast\>' contained conceal cchar=⊛ - syntax match texMathSymbol '\\circledcirc\>' contained conceal cchar=⊚ - syntax match texMathSymbol '\\circleddash\>' contained conceal cchar=⊝ - syntax match texMathSymbol '\\complement\>' contained conceal cchar=∁ - syntax match texMathSymbol '\\curlyeqprec\>' contained conceal cchar=⋞ - syntax match texMathSymbol '\\curlyeqsucc\>' contained conceal cchar=⋟ - syntax match texMathSymbol '\\curlyvee\>' contained conceal cchar=⋎ - syntax match texMathSymbol '\\curlywedge\>' contained conceal cchar=⋏ - syntax match texMathSymbol '\\curvearrowleft\>' contained conceal cchar=↶ - syntax match texMathSymbol '\\curvearrowright\>' contained conceal cchar=↷ - syntax match texMathSymbol '\\daleth\>' contained conceal cchar=ℸ - syntax match texMathSymbol '\\diagdown\>' contained conceal cchar=╲ - syntax match texMathSymbol '\\diagup\>' contained conceal cchar=╱ - syntax match texMathSymbol '\\digamma\>' contained conceal cchar=ϝ - syntax match texMathSymbol '\\divideontimes\>' contained conceal cchar=⋇ - syntax match texMathSymbol '\\doteqdot\>' contained conceal cchar=≑ - syntax match texMathSymbol '\\dotplus\>' contained conceal cchar=∔ - syntax match texMathSymbol '\\doublebarwedge\>' contained conceal cchar=⩞ - syntax match texMathSymbol '\\downdownarrows\>' contained conceal cchar=⇊ - syntax match texMathSymbol '\\downharpoonleft\>' contained conceal cchar=⇃ - syntax match texMathSymbol '\\downharpoonright\>' contained conceal cchar=⇂ - syntax match texMathSymbol '\\eqcirc\>' contained conceal cchar=≖ - syntax match texMathSymbol '\\eqsim\>' contained conceal cchar=≂ - syntax match texMathSymbol '\\eqslantgtr\>' contained conceal cchar=⪖ - syntax match texMathSymbol '\\eqslantless\>' contained conceal cchar=⪕ - syntax match texMathSymbol '\\fallingdotseq\>' contained conceal cchar=≒ - syntax match texMathSymbol '\\geqq\>' contained conceal cchar=≧ - syntax match texMathSymbol '\\geqslant\>' contained conceal cchar=⩾ - syntax match texMathSymbol '\\gimel\>' contained conceal cchar=ℷ - syntax match texMathSymbol '\\gnapprox\>' contained conceal cchar=⪊ - syntax match texMathSymbol '\\gneq\>' contained conceal cchar=⪈ - syntax match texMathSymbol '\\gneqq\>' contained conceal cchar=≩ - syntax match texMathSymbol '\\gnsim\>' contained conceal cchar=⋧ - syntax match texMathSymbol '\\gtrapprox\>' contained conceal cchar=⪆ - syntax match texMathSymbol '\\gtrdot\>' contained conceal cchar=⋗ - syntax match texMathSymbol '\\gtreqless\>' contained conceal cchar=⋛ - syntax match texMathSymbol '\\gtreqqless\>' contained conceal cchar=⪌ - syntax match texMathSymbol '\\gtrless\>' contained conceal cchar=≷ - syntax match texMathSymbol '\\gtrsim\>' contained conceal cchar=≳ - syntax match texMathSymbol '\\gvertneqq\>' contained conceal cchar= - syntax match texMathSymbol '\\hslash\>' contained conceal cchar=ℏ - syntax match texMathSymbol '\\intercal\>' contained conceal cchar=⊺ - syntax match texMathSymbol '\\leftarrowtail\>' contained conceal cchar=↢ - syntax match texMathSymbol '\\leftleftarrows\>' contained conceal cchar=⇇ - syntax match texMathSymbol '\\leftrightarrows\>' contained conceal cchar=⇆ - syntax match texMathSymbol '\\leftrightharpoons\>' contained conceal cchar=⇋ - syntax match texMathSymbol '\\leftrightsquigarrow\>' contained conceal cchar=↭ - syntax match texMathSymbol '\\leftthreetimes\>' contained conceal cchar=⋋ - syntax match texMathSymbol '\\leqq\>' contained conceal cchar=≦ - syntax match texMathSymbol '\\leqslant\>' contained conceal cchar=⩽ - syntax match texMathSymbol '\\lessapprox\>' contained conceal cchar=⪅ - syntax match texMathSymbol '\\lessdot\>' contained conceal cchar=⋖ - syntax match texMathSymbol '\\lesseqgtr\>' contained conceal cchar=⋚ - syntax match texMathSymbol '\\lesseqqgtr\>' contained conceal cchar=⪋ - syntax match texMathSymbol '\\lessgtr\>' contained conceal cchar=≶ - syntax match texMathSymbol '\\lesssim\>' contained conceal cchar=≲ - syntax match texMathSymbol '\\lnapprox\>' contained conceal cchar=⪉ - syntax match texMathSymbol '\\lneq\>' contained conceal cchar=⪇ - syntax match texMathSymbol '\\lneqq\>' contained conceal cchar=≨ - syntax match texMathSymbol '\\lnsim\>' contained conceal cchar=⋦ - syntax match texMathSymbol '\\looparrowleft\>' contained conceal cchar=↫ - syntax match texMathSymbol '\\looparrowright\>' contained conceal cchar=↬ - syntax match texMathSymbol '\\lozenge\>' contained conceal cchar=◊ - syntax match texMathSymbol '\\ltimes\>' contained conceal cchar=⋉ - syntax match texMathSymbol '\\lvertneqq\>' contained conceal cchar= - syntax match texMathSymbol '\\maltese\>' contained conceal cchar=✠ - syntax match texMathSymbol '\\measuredangle\>' contained conceal cchar=∡ - syntax match texMathSymbol '\\multimap\>' contained conceal cchar=⊸ - syntax match texMathSymbol '\\nLeftarrow\>' contained conceal cchar=⇍ - syntax match texMathSymbol '\\nLeftrightarrow\>' contained conceal cchar=⇎ - syntax match texMathSymbol '\\nRightarrow\>' contained conceal cchar=⇏ - syntax match texMathSymbol '\\nVDash\>' contained conceal cchar=⊯ - syntax match texMathSymbol '\\nVdash\>' contained conceal cchar=⊮ - syntax match texMathSymbol '\\ncong\>' contained conceal cchar=≆ - syntax match texMathSymbol '\\nexists\>' contained conceal cchar=∄ - syntax match texMathSymbol '\\ngeq\>' contained conceal cchar=≱ - syntax match texMathSymbol '\\ngeqq\>' contained conceal cchar= - syntax match texMathSymbol '\\ngeqslant\>' contained conceal cchar= - syntax match texMathSymbol '\\ngtr\>' contained conceal cchar=≯ - syntax match texMathSymbol '\\nleftarrow\>' contained conceal cchar=↚ - syntax match texMathSymbol '\\nleftrightarrow\>' contained conceal cchar=↮ - syntax match texMathSymbol '\\nleq\>' contained conceal cchar=≰ - syntax match texMathSymbol '\\nleqq\>' contained conceal cchar= - syntax match texMathSymbol '\\nleqslant\>' contained conceal cchar= - syntax match texMathSymbol '\\nless\>' contained conceal cchar=≮ - syntax match texMathSymbol '\\nmid\>' contained conceal cchar=∤ - syntax match texMathSymbol '\\nparallel\>' contained conceal cchar=∦ - syntax match texMathSymbol '\\nprec\>' contained conceal cchar=⊀ - syntax match texMathSymbol '\\npreceq\>' contained conceal cchar=⋠ - syntax match texMathSymbol '\\nrightarrow\>' contained conceal cchar=↛ - syntax match texMathSymbol '\\nshortmid\>' contained conceal cchar= - syntax match texMathSymbol '\\nshortparallel\>' contained conceal cchar= - syntax match texMathSymbol '\\nsim\>' contained conceal cchar=≁ - syntax match texMathSymbol '\\nsubseteq\>' contained conceal cchar=⊈ - syntax match texMathSymbol '\\nsubseteqq\>' contained conceal cchar= - syntax match texMathSymbol '\\nsucc\>' contained conceal cchar=⊁ - syntax match texMathSymbol '\\nsucceq\>' contained conceal cchar=⋡ - syntax match texMathSymbol '\\nsupseteq\>' contained conceal cchar=⊉ - syntax match texMathSymbol '\\nsupseteqq\>' contained conceal cchar= - syntax match texMathSymbol '\\ntriangleleft\>' contained conceal cchar=⋪ - syntax match texMathSymbol '\\ntrianglelefteq\>' contained conceal cchar=⋬ - syntax match texMathSymbol '\\ntriangleright\>' contained conceal cchar=⋫ - syntax match texMathSymbol '\\ntrianglerighteq\>' contained conceal cchar=⋭ - syntax match texMathSymbol '\\nvDash\>' contained conceal cchar=⊭ - syntax match texMathSymbol '\\nvdash\>' contained conceal cchar=⊬ - syntax match texMathSymbol '\\pitchfork\>' contained conceal cchar=⋔ - syntax match texMathSymbol '\\precapprox\>' contained conceal cchar=⪷ - syntax match texMathSymbol '\\preccurlyeq\>' contained conceal cchar=≼ - syntax match texMathSymbol '\\precnapprox\>' contained conceal cchar=⪹ - syntax match texMathSymbol '\\precneqq\>' contained conceal cchar=⪵ - syntax match texMathSymbol '\\precnsim\>' contained conceal cchar=⋨ - syntax match texMathSymbol '\\precsim\>' contained conceal cchar=≾ - syntax match texMathSymbol '\\rightarrowtail\>' contained conceal cchar=↣ - syntax match texMathSymbol '\\rightleftarrows\>' contained conceal cchar=⇄ - syntax match texMathSymbol '\\rightrightarrows\>' contained conceal cchar=⇉ - syntax match texMathSymbol '\\rightsquigarrow\>' contained conceal cchar=⇝ - syntax match texMathSymbol '\\rightthreetimes\>' contained conceal cchar=⋌ - syntax match texMathSymbol '\\risingdotseq\>' contained conceal cchar=≓ - syntax match texMathSymbol '\\rtimes\>' contained conceal cchar=⋊ - syntax match texMathSymbol '\\shortmid\>' contained conceal cchar=∣ - syntax match texMathSymbol '\\shortparallel\>' contained conceal cchar=∥ - syntax match texMathSymbol '\\smallfrown\>' contained conceal cchar=⌢ - syntax match texMathSymbol '\\smallsetminus\>' contained conceal cchar=∖ - syntax match texMathSymbol '\\smallsmile\>' contained conceal cchar=⌣ - syntax match texMathSymbol '\\sphericalangle\>' contained conceal cchar=∢ - syntax match texMathSymbol '\\square\>' contained conceal cchar=□ - syntax match texMathSymbol '\\subseteqq\>' contained conceal cchar=⫅ - syntax match texMathSymbol '\\subsetneq\>' contained conceal cchar=⊊ - syntax match texMathSymbol '\\subsetneqq\>' contained conceal cchar=⫋ - syntax match texMathSymbol '\\succapprox\>' contained conceal cchar=⪸ - syntax match texMathSymbol '\\succcurlyeq\>' contained conceal cchar=≽ - syntax match texMathSymbol '\\succnapprox\>' contained conceal cchar=⪺ - syntax match texMathSymbol '\\succneqq\>' contained conceal cchar=⪶ - syntax match texMathSymbol '\\succnsim\>' contained conceal cchar=⋩ - syntax match texMathSymbol '\\succsim\>' contained conceal cchar=≿ - syntax match texMathSymbol '\\supseteqq\>' contained conceal cchar=⫆ - syntax match texMathSymbol '\\supsetneq\>' contained conceal cchar=⊋ - syntax match texMathSymbol '\\supsetneqq\>' contained conceal cchar=⫌ - syntax match texMathSymbol '\\therefore\>' contained conceal cchar=∴ - syntax match texMathSymbol '\\thickapprox\>' contained conceal cchar=≈ - syntax match texMathSymbol '\\thicksim\>' contained conceal cchar=∼ - syntax match texMathSymbol '\\triangledown\>' contained conceal cchar=▽ - syntax match texMathSymbol '\\trianglelefteq\>' contained conceal cchar=⊴ - syntax match texMathSymbol '\\triangleq\>' contained conceal cchar=≜ - syntax match texMathSymbol '\\trianglerighteq\>' contained conceal cchar=⊵ - syntax match texMathSymbol '\\twoheadleftarrow\>' contained conceal cchar=↞ - syntax match texMathSymbol '\\twoheadrightarrow\>' contained conceal cchar=↠ - syntax match texMathSymbol '\\upharpoonleft\>' contained conceal cchar=↿ - syntax match texMathSymbol '\\upharpoonright\>' contained conceal cchar=↾ - syntax match texMathSymbol '\\upuparrows\>' contained conceal cchar=⇈ - syntax match texMathSymbol '\\vDash\>' contained conceal cchar=⊨ - syntax match texMathSymbol '\\varkappa\>' contained conceal cchar=ϰ - syntax match texMathSymbol '\\varnothing\>' contained conceal cchar=∅ - syntax match texMathSymbol '\\varpropto\>' contained conceal cchar=∝ - syntax match texMathSymbol '\\varsubsetneq\>' contained conceal cchar= - syntax match texMathSymbol '\\varsubsetneqq\>' contained conceal cchar= - syntax match texMathSymbol '\\varsupsetneq\>' contained conceal cchar= - syntax match texMathSymbol '\\varsupsetneqq\>' contained conceal cchar= - syntax match texMathSymbol '\\vartriangle\>' contained conceal cchar=△ - syntax match texMathSymbol '\\vartriangleleft\>' contained conceal cchar=⊲ - syntax match texMathSymbol '\\vartriangleright\>' contained conceal cchar=⊳ - syntax match texMathSymbol '\\veebar\>' contained conceal cchar=⊻ - syntax match texMathSymbol '\\ulcorner\>' contained conceal cchar=⌜ - syntax match texMathSymbol '\\urcorner\>' contained conceal cchar=⌝ - syntax match texMathSymbol '\\llcorner\>' contained conceal cchar=⌞ - syntax match texMathSymbol '\\lrcorner\>' contained conceal cchar=⌟ + syntax match texMathSymbol '\%#=1\\Bbbk\>' contained conceal cchar=𝕜 + syntax match texMathSymbol '\%#=1\\Bumpeq\>' contained conceal cchar=≎ + syntax match texMathSymbol '\%#=1\\Finv\>' contained conceal cchar=Ⅎ + syntax match texMathSymbol '\%#=1\\Game\>' contained conceal cchar=⅁ + syntax match texMathSymbol '\%#=1\\Lleftarrow\>' contained conceal cchar=⇚ + syntax match texMathSymbol '\%#=1\\Rrightarrow\>' contained conceal cchar=⇛ + syntax match texMathSymbol '\%#=1\\Subset\>' contained conceal cchar=⋐ + syntax match texMathSymbol '\%#=1\\Supset\>' contained conceal cchar=⋑ + syntax match texMathSymbol '\%#=1\\Vdash\>' contained conceal cchar=⊩ + syntax match texMathSymbol '\%#=1\\Vvdash\>' contained conceal cchar=⊪ + syntax match texMathSymbol '\%#=1\\approxeq\>' contained conceal cchar=≊ + syntax match texMathSymbol '\%#=1\\backepsilon\>' contained conceal cchar=∍ + syntax match texMathSymbol '\%#=1\\backprime\>' contained conceal cchar=‵ + syntax match texMathSymbol '\%#=1\\backsim\>' contained conceal cchar=∽ + syntax match texMathSymbol '\%#=1\\backsimeq\>' contained conceal cchar=⋍ + syntax match texMathSymbol '\%#=1\\barwedge\>' contained conceal cchar=⊼ + syntax match texMathSymbol '\%#=1\\because\>' contained conceal cchar=∵ + syntax match texMathSymbol '\%#=1\\beth\>' contained conceal cchar=ℶ + syntax match texMathSymbol '\%#=1\\between\>' contained conceal cchar=≬ + syntax match texMathSymbol '\%#=1\\bigstar\>' contained conceal cchar=★ + syntax match texMathSymbol '\%#=1\\blacklozenge\>' contained conceal cchar=◆ + syntax match texMathSymbol '\%#=1\\blacksquare\>' contained conceal cchar=■ + syntax match texMathSymbol '\%#=1\\blacktriangle\>' contained conceal cchar=▲ + syntax match texMathSymbol '\%#=1\\blacktriangledown\>' contained conceal cchar=▼ + syntax match texMathSymbol '\%#=1\\blacktriangleleft\>' contained conceal cchar=◀ + syntax match texMathSymbol '\%#=1\\blacktriangleright\>' contained conceal cchar=▶ + syntax match texMathSymbol '\%#=1\\boxdot\>' contained conceal cchar=⊡ + syntax match texMathSymbol '\%#=1\\boxminus\>' contained conceal cchar=⊟ + syntax match texMathSymbol '\%#=1\\boxplus\>' contained conceal cchar=⊞ + syntax match texMathSymbol '\%#=1\\boxtimes\>' contained conceal cchar=⊠ + syntax match texMathSymbol '\%#=1\\bumpeq\>' contained conceal cchar=≏ + syntax match texMathSymbol '\%#=1\\centerdot\>' contained conceal cchar=⋅ + syntax match texMathSymbol '\%#=1\\checkmark\>' contained conceal cchar=✓ + syntax match texMathSymbol '\%#=1\\circeq\>' contained conceal cchar=≗ + syntax match texMathSymbol '\%#=1\\circlearrowleft\>' contained conceal cchar=↺ + syntax match texMathSymbol '\%#=1\\circlearrowright\>' contained conceal cchar=↻ + syntax match texMathSymbol '\%#=1\\circledS\>' contained conceal cchar=Ⓢ + syntax match texMathSymbol '\%#=1\\circledast\>' contained conceal cchar=⊛ + syntax match texMathSymbol '\%#=1\\circledcirc\>' contained conceal cchar=⊚ + syntax match texMathSymbol '\%#=1\\circleddash\>' contained conceal cchar=⊝ + syntax match texMathSymbol '\%#=1\\complement\>' contained conceal cchar=∁ + syntax match texMathSymbol '\%#=1\\curlyeqprec\>' contained conceal cchar=⋞ + syntax match texMathSymbol '\%#=1\\curlyeqsucc\>' contained conceal cchar=⋟ + syntax match texMathSymbol '\%#=1\\curlyvee\>' contained conceal cchar=⋎ + syntax match texMathSymbol '\%#=1\\curlywedge\>' contained conceal cchar=⋏ + syntax match texMathSymbol '\%#=1\\curvearrowleft\>' contained conceal cchar=↶ + syntax match texMathSymbol '\%#=1\\curvearrowright\>' contained conceal cchar=↷ + syntax match texMathSymbol '\%#=1\\daleth\>' contained conceal cchar=ℸ + syntax match texMathSymbol '\%#=1\\diagdown\>' contained conceal cchar=╲ + syntax match texMathSymbol '\%#=1\\diagup\>' contained conceal cchar=╱ + syntax match texMathSymbol '\%#=1\\digamma\>' contained conceal cchar=ϝ + syntax match texMathSymbol '\%#=1\\divideontimes\>' contained conceal cchar=⋇ + syntax match texMathSymbol '\%#=1\\doteqdot\>' contained conceal cchar=≑ + syntax match texMathSymbol '\%#=1\\dotplus\>' contained conceal cchar=∔ + syntax match texMathSymbol '\%#=1\\doublebarwedge\>' contained conceal cchar=⩞ + syntax match texMathSymbol '\%#=1\\downdownarrows\>' contained conceal cchar=⇊ + syntax match texMathSymbol '\%#=1\\downharpoonleft\>' contained conceal cchar=⇃ + syntax match texMathSymbol '\%#=1\\downharpoonright\>' contained conceal cchar=⇂ + syntax match texMathSymbol '\%#=1\\eqcirc\>' contained conceal cchar=≖ + syntax match texMathSymbol '\%#=1\\eqsim\>' contained conceal cchar=≂ + syntax match texMathSymbol '\%#=1\\eqslantgtr\>' contained conceal cchar=⪖ + syntax match texMathSymbol '\%#=1\\eqslantless\>' contained conceal cchar=⪕ + syntax match texMathSymbol '\%#=1\\fallingdotseq\>' contained conceal cchar=≒ + syntax match texMathSymbol '\%#=1\\geqq\>' contained conceal cchar=≧ + syntax match texMathSymbol '\%#=1\\geqslant\>' contained conceal cchar=⩾ + syntax match texMathSymbol '\%#=1\\gimel\>' contained conceal cchar=ℷ + syntax match texMathSymbol '\%#=1\\gnapprox\>' contained conceal cchar=⪊ + syntax match texMathSymbol '\%#=1\\gneq\>' contained conceal cchar=⪈ + syntax match texMathSymbol '\%#=1\\gneqq\>' contained conceal cchar=≩ + syntax match texMathSymbol '\%#=1\\gnsim\>' contained conceal cchar=⋧ + syntax match texMathSymbol '\%#=1\\gtrapprox\>' contained conceal cchar=⪆ + syntax match texMathSymbol '\%#=1\\gtrdot\>' contained conceal cchar=⋗ + syntax match texMathSymbol '\%#=1\\gtreqless\>' contained conceal cchar=⋛ + syntax match texMathSymbol '\%#=1\\gtreqqless\>' contained conceal cchar=⪌ + syntax match texMathSymbol '\%#=1\\gtrless\>' contained conceal cchar=≷ + syntax match texMathSymbol '\%#=1\\gtrsim\>' contained conceal cchar=≳ + syntax match texMathSymbol '\%#=1\\gvertneqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\hslash\>' contained conceal cchar=ℏ + syntax match texMathSymbol '\%#=1\\intercal\>' contained conceal cchar=⊺ + syntax match texMathSymbol '\%#=1\\leftarrowtail\>' contained conceal cchar=↢ + syntax match texMathSymbol '\%#=1\\leftleftarrows\>' contained conceal cchar=⇇ + syntax match texMathSymbol '\%#=1\\leftrightarrows\>' contained conceal cchar=⇆ + syntax match texMathSymbol '\%#=1\\leftrightharpoons\>' contained conceal cchar=⇋ + syntax match texMathSymbol '\%#=1\\leftrightsquigarrow\>' contained conceal cchar=↭ + syntax match texMathSymbol '\%#=1\\leftthreetimes\>' contained conceal cchar=⋋ + syntax match texMathSymbol '\%#=1\\leqq\>' contained conceal cchar=≦ + syntax match texMathSymbol '\%#=1\\leqslant\>' contained conceal cchar=⩽ + syntax match texMathSymbol '\%#=1\\lessapprox\>' contained conceal cchar=⪅ + syntax match texMathSymbol '\%#=1\\lessdot\>' contained conceal cchar=⋖ + syntax match texMathSymbol '\%#=1\\lesseqgtr\>' contained conceal cchar=⋚ + syntax match texMathSymbol '\%#=1\\lesseqqgtr\>' contained conceal cchar=⪋ + syntax match texMathSymbol '\%#=1\\lessgtr\>' contained conceal cchar=≶ + syntax match texMathSymbol '\%#=1\\lesssim\>' contained conceal cchar=≲ + syntax match texMathSymbol '\%#=1\\lnapprox\>' contained conceal cchar=⪉ + syntax match texMathSymbol '\%#=1\\lneq\>' contained conceal cchar=⪇ + syntax match texMathSymbol '\%#=1\\lneqq\>' contained conceal cchar=≨ + syntax match texMathSymbol '\%#=1\\lnsim\>' contained conceal cchar=⋦ + syntax match texMathSymbol '\%#=1\\looparrowleft\>' contained conceal cchar=↫ + syntax match texMathSymbol '\%#=1\\looparrowright\>' contained conceal cchar=↬ + syntax match texMathSymbol '\%#=1\\lozenge\>' contained conceal cchar=◊ + syntax match texMathSymbol '\%#=1\\ltimes\>' contained conceal cchar=⋉ + syntax match texMathSymbol '\%#=1\\lvertneqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\maltese\>' contained conceal cchar=✠ + syntax match texMathSymbol '\%#=1\\measuredangle\>' contained conceal cchar=∡ + syntax match texMathSymbol '\%#=1\\multimap\>' contained conceal cchar=⊸ + syntax match texMathSymbol '\%#=1\\nLeftarrow\>' contained conceal cchar=⇍ + syntax match texMathSymbol '\%#=1\\nLeftrightarrow\>' contained conceal cchar=⇎ + syntax match texMathSymbol '\%#=1\\nRightarrow\>' contained conceal cchar=⇏ + syntax match texMathSymbol '\%#=1\\nVDash\>' contained conceal cchar=⊯ + syntax match texMathSymbol '\%#=1\\nVdash\>' contained conceal cchar=⊮ + syntax match texMathSymbol '\%#=1\\ncong\>' contained conceal cchar=≆ + syntax match texMathSymbol '\%#=1\\nexists\>' contained conceal cchar=∄ + syntax match texMathSymbol '\%#=1\\ngeq\>' contained conceal cchar=≱ + syntax match texMathSymbol '\%#=1\\ngeqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\ngeqslant\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\ngtr\>' contained conceal cchar=≯ + syntax match texMathSymbol '\%#=1\\nleftarrow\>' contained conceal cchar=↚ + syntax match texMathSymbol '\%#=1\\nleftrightarrow\>' contained conceal cchar=↮ + syntax match texMathSymbol '\%#=1\\nleq\>' contained conceal cchar=≰ + syntax match texMathSymbol '\%#=1\\nleqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\nleqslant\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\nless\>' contained conceal cchar=≮ + syntax match texMathSymbol '\%#=1\\nmid\>' contained conceal cchar=∤ + syntax match texMathSymbol '\%#=1\\nparallel\>' contained conceal cchar=∦ + syntax match texMathSymbol '\%#=1\\nprec\>' contained conceal cchar=⊀ + syntax match texMathSymbol '\%#=1\\npreceq\>' contained conceal cchar=⋠ + syntax match texMathSymbol '\%#=1\\nrightarrow\>' contained conceal cchar=↛ + syntax match texMathSymbol '\%#=1\\nshortmid\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\nshortparallel\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\nsim\>' contained conceal cchar=≁ + syntax match texMathSymbol '\%#=1\\nsubseteq\>' contained conceal cchar=⊈ + syntax match texMathSymbol '\%#=1\\nsubseteqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\nsucc\>' contained conceal cchar=⊁ + syntax match texMathSymbol '\%#=1\\nsucceq\>' contained conceal cchar=⋡ + syntax match texMathSymbol '\%#=1\\nsupseteq\>' contained conceal cchar=⊉ + syntax match texMathSymbol '\%#=1\\nsupseteqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\ntriangleleft\>' contained conceal cchar=⋪ + syntax match texMathSymbol '\%#=1\\ntrianglelefteq\>' contained conceal cchar=⋬ + syntax match texMathSymbol '\%#=1\\ntriangleright\>' contained conceal cchar=⋫ + syntax match texMathSymbol '\%#=1\\ntrianglerighteq\>' contained conceal cchar=⋭ + syntax match texMathSymbol '\%#=1\\nvDash\>' contained conceal cchar=⊭ + syntax match texMathSymbol '\%#=1\\nvdash\>' contained conceal cchar=⊬ + syntax match texMathSymbol '\%#=1\\pitchfork\>' contained conceal cchar=⋔ + syntax match texMathSymbol '\%#=1\\precapprox\>' contained conceal cchar=⪷ + syntax match texMathSymbol '\%#=1\\preccurlyeq\>' contained conceal cchar=≼ + syntax match texMathSymbol '\%#=1\\precnapprox\>' contained conceal cchar=⪹ + syntax match texMathSymbol '\%#=1\\precneqq\>' contained conceal cchar=⪵ + syntax match texMathSymbol '\%#=1\\precnsim\>' contained conceal cchar=⋨ + syntax match texMathSymbol '\%#=1\\precsim\>' contained conceal cchar=≾ + syntax match texMathSymbol '\%#=1\\rightarrowtail\>' contained conceal cchar=↣ + syntax match texMathSymbol '\%#=1\\rightleftarrows\>' contained conceal cchar=⇄ + syntax match texMathSymbol '\%#=1\\rightrightarrows\>' contained conceal cchar=⇉ + syntax match texMathSymbol '\%#=1\\rightsquigarrow\>' contained conceal cchar=⇝ + syntax match texMathSymbol '\%#=1\\rightthreetimes\>' contained conceal cchar=⋌ + syntax match texMathSymbol '\%#=1\\risingdotseq\>' contained conceal cchar=≓ + syntax match texMathSymbol '\%#=1\\rtimes\>' contained conceal cchar=⋊ + syntax match texMathSymbol '\%#=1\\shortmid\>' contained conceal cchar=∣ + syntax match texMathSymbol '\%#=1\\shortparallel\>' contained conceal cchar=∥ + syntax match texMathSymbol '\%#=1\\smallfrown\>' contained conceal cchar=⌢ + syntax match texMathSymbol '\%#=1\\smallsetminus\>' contained conceal cchar=∖ + syntax match texMathSymbol '\%#=1\\smallsmile\>' contained conceal cchar=⌣ + syntax match texMathSymbol '\%#=1\\sphericalangle\>' contained conceal cchar=∢ + syntax match texMathSymbol '\%#=1\\square\>' contained conceal cchar=□ + syntax match texMathSymbol '\%#=1\\subseteqq\>' contained conceal cchar=⫅ + syntax match texMathSymbol '\%#=1\\subsetneq\>' contained conceal cchar=⊊ + syntax match texMathSymbol '\%#=1\\subsetneqq\>' contained conceal cchar=⫋ + syntax match texMathSymbol '\%#=1\\succapprox\>' contained conceal cchar=⪸ + syntax match texMathSymbol '\%#=1\\succcurlyeq\>' contained conceal cchar=≽ + syntax match texMathSymbol '\%#=1\\succnapprox\>' contained conceal cchar=⪺ + syntax match texMathSymbol '\%#=1\\succneqq\>' contained conceal cchar=⪶ + syntax match texMathSymbol '\%#=1\\succnsim\>' contained conceal cchar=⋩ + syntax match texMathSymbol '\%#=1\\succsim\>' contained conceal cchar=≿ + syntax match texMathSymbol '\%#=1\\supseteqq\>' contained conceal cchar=⫆ + syntax match texMathSymbol '\%#=1\\supsetneq\>' contained conceal cchar=⊋ + syntax match texMathSymbol '\%#=1\\supsetneqq\>' contained conceal cchar=⫌ + syntax match texMathSymbol '\%#=1\\therefore\>' contained conceal cchar=∴ + syntax match texMathSymbol '\%#=1\\thickapprox\>' contained conceal cchar=≈ + syntax match texMathSymbol '\%#=1\\thicksim\>' contained conceal cchar=∼ + syntax match texMathSymbol '\%#=1\\triangledown\>' contained conceal cchar=▽ + syntax match texMathSymbol '\%#=1\\trianglelefteq\>' contained conceal cchar=⊴ + syntax match texMathSymbol '\%#=1\\triangleq\>' contained conceal cchar=≜ + syntax match texMathSymbol '\%#=1\\trianglerighteq\>' contained conceal cchar=⊵ + syntax match texMathSymbol '\%#=1\\twoheadleftarrow\>' contained conceal cchar=↞ + syntax match texMathSymbol '\%#=1\\twoheadrightarrow\>' contained conceal cchar=↠ + syntax match texMathSymbol '\%#=1\\upharpoonleft\>' contained conceal cchar=↿ + syntax match texMathSymbol '\%#=1\\upharpoonright\>' contained conceal cchar=↾ + syntax match texMathSymbol '\%#=1\\upuparrows\>' contained conceal cchar=⇈ + syntax match texMathSymbol '\%#=1\\vDash\>' contained conceal cchar=⊨ + syntax match texMathSymbol '\%#=1\\varkappa\>' contained conceal cchar=ϰ + syntax match texMathSymbol '\%#=1\\varnothing\>' contained conceal cchar=∅ + syntax match texMathSymbol '\%#=1\\varpropto\>' contained conceal cchar=∝ + syntax match texMathSymbol '\%#=1\\varsubsetneq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\varsubsetneqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\varsupsetneq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\varsupsetneqq\>' contained conceal cchar= + syntax match texMathSymbol '\%#=1\\vartriangle\>' contained conceal cchar=△ + syntax match texMathSymbol '\%#=1\\vartriangleleft\>' contained conceal cchar=⊲ + syntax match texMathSymbol '\%#=1\\vartriangleright\>' contained conceal cchar=⊳ + syntax match texMathSymbol '\%#=1\\veebar\>' contained conceal cchar=⊻ + syntax match texMathSymbol '\%#=1\\ulcorner\>' contained conceal cchar=⌜ + syntax match texMathSymbol '\%#=1\\urcorner\>' contained conceal cchar=⌝ + syntax match texMathSymbol '\%#=1\\llcorner\>' contained conceal cchar=⌞ + syntax match texMathSymbol '\%#=1\\lrcorner\>' contained conceal cchar=⌟ endfunction " }}}1 diff --git a/autoload/vimtex/syntax/p/mathtools.vim b/autoload/vimtex/syntax/p/mathtools.vim index 3ec27baaced..3b21c4af05c 100644 --- a/autoload/vimtex/syntax/p/mathtools.vim +++ b/autoload/vimtex/syntax/p/mathtools.vim @@ -15,13 +15,13 @@ function! vimtex#syntax#p#mathtools#load(cfg) abort " {{{1 endif " Support for various environments with option groups - syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\v\\begin\{%( + syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos1 "\%#=1\v\\begin\{%( \aligned \|[lr]gathered \|[pbBvV]?%(small)?matrix\* \)\}" syntax match texMathCmdEnv contained contains=texCmdMathEnv nextgroup=texMathToolsOptPos2 "\\begin{multlined}" - syntax match texMathCmdEnv contained contains=texCmdMathEnv "\v\\end\{%( + syntax match texMathCmdEnv contained contains=texCmdMathEnv "\%#=1\v\\end\{%( \aligned \|[lr]gathered \|[pbBvV]?%(small)?matrix\* From 884ed447e773f4cf51d833f285a2ba38188191bd Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Sun, 29 Sep 2024 12:52:26 -0700 Subject: [PATCH 7/9] feat(syntax): `\lVert` and `\rVert` highlighting --- autoload/vimtex/syntax/core.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index bd257851237..d60b551ef34 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -2003,7 +2003,7 @@ function! s:match_math_delims() abort " {{{1 syntax match texMathDelim contained "\%#=1\\[{}]" syntax match texMathDelim contained "\%#=1\v\\%( - \[lr]%(vert|angle|brace|ceil|floor|group|moustache) + \[lr]%([vV]ert|angle|brace|ceil|floor|group|moustache) \|backslash \|[uU]%(down)?parrow \|[dD]ownarrow From 3f2e7436dc24b6390e09cb108599abb41b60d447 Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Sun, 29 Sep 2024 19:11:56 -0700 Subject: [PATCH 8/9] perf(syntax): Add `display` to some rules This results in a ~3% speedup. --- autoload/vimtex/syntax/core.vim | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index d60b551ef34..58b532b18ac 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -9,9 +9,9 @@ scriptencoding utf-8 function! vimtex#syntax#core#init_rules() abort " {{{1 " Operators and similar - syntax match texMathOper "\%#=1[-+=/<>|]" contained - syntax match texMathSuperSub "\%#=1[_^]" contained - syntax match texMathDelim contained "\%#=1[()[\]]" + syntax match texMathOper "\%#=1[-+=/<>|]" contained display + syntax match texMathSuperSub "\%#=1[_^]" contained display + syntax match texMathDelim contained "\%#=1[()[\]]" display " {{{2 Define main syntax clusters syntax cluster texClusterOpt contains= @@ -45,10 +45,10 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " {{{2 TeX symbols and special characters - syntax match texLigature "---\?" - syntax match texLigature "``" - syntax match texLigature "''" - syntax match texLigature ",," + syntax match texLigature "---\?" display + syntax match texLigature "``" display + syntax match texLigature "''" display + syntax match texLigature ",," display syntax match texTabularChar "&" syntax match texTabularChar "\\\\" @@ -58,7 +58,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 syntax match texSpecialChar "\%#=1\\[SP@]\ze[^a-zA-Z@]" syntax match texSpecialChar "\%#=1\^\^\%(\S\|[0-9a-f]\{2}\)" - syntax match texError "\%#=1[_^]" + syntax match texError "\%#=1[_^]" display " }}}2 " {{{2 Commands: general @@ -68,7 +68,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texGroup', {'opts': ''}) " Flag mismatching ending brace delimiter - syntax match texGroupError "}" + syntax match texGroupError "}" display " Add generic option elements contained in common option groups syntax match texOptEqual contained "=" @@ -149,7 +149,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 " LaTeX 2.09 type styles - syntax match texCmdStyle "\%#=1\v\\%(rm|em|bf|it|s[cfl]|tt)>" + syntax match texCmdStyle "\%#=1\v\\%(rm|em|bf|it|s[cfl]|tt)>" display " LaTeX2E type styles @@ -159,7 +159,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \|%(rm|sf|tt)family \|%(it|sc|sl|up)shape \|%(bf|md)series - \)>" + \)>" display " Bold and italic commands call s:match_bold_italic() @@ -171,7 +171,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \|small \|[lL]arge|LARGE \|[hH]uge - \)>" + \)>" display " \newcommand syntax match texCmdNewcmd "\%#=1\\\%(re\)\?newcommand\>\*\?" @@ -241,7 +241,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \ {'contains': 'texComment,@NoSpell'}) " Sections and parts - syntax match texCmdPart "\%#=1\\\(front\|main\|back\)matter\>" + syntax match texCmdPart "\%#=1\\\(front\|main\|back\)matter\>" display syntax match texCmdPart "\%#=1\v\\%( \%(part|%(sub)?paragraph)> \|%(%(sub)*section|chapter)>\*? @@ -387,14 +387,14 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 endif " Don't spell check magic comments/directives - syntax match texComment "\%#=1^\s*%\s*!.*" contains=@NoSpell + syntax match texComment "\%#=1^\s*%\s*!.*" contains=@NoSpell display " Do not check URLs and acronyms in comments " Source: https://github.com/lervag/vimtex/issues/562 syntax match texCommentURL "\%#=1\w\+:\/\/[^[:space:]]\+" - \ containedin=texComment contained contains=@NoSpell + \ containedin=texComment contained contains=@NoSpell display syntax match texCommentAcronym "\%#=1\v<(\u|\d){3,}s?>" - \ containedin=texComment contained contains=@NoSpell + \ containedin=texComment contained contains=@NoSpell display " Todo and similar within comments syntax case ignore @@ -560,7 +560,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 call vimtex#syntax#core#new_arg('texMathZoneEnsured', {'contains': '@texClusterMath'}) " Bad/Mismatched math - syntax match texMathError "\%#=1\\[\])]" + syntax match texMathError "\%#=1\\[\])]" display " Text Inside Math regions @@ -1233,7 +1233,7 @@ function! vimtex#syntax#core#new_env(cfg) abort " {{{1 execute 'syntax match texMathError "\%#=1\\\%()\|]\|end{\%(' \ . join(s:custom_math_envs, '\|') \ . '\|' . s:std_math_envs - \ . '\)}\)"' + \ . '\)}\)" display' execute 'syntax region texMathZoneEnv' \ 'start="\%#=1\\begin{\z(' . join(s:custom_math_envs, '\|') . '\)}"' @@ -1998,16 +1998,16 @@ endfunction " }}}1 function! s:match_math_delims() abort " {{{1 - syntax match texMathDelimMod contained "\%#=1\\\%(left\|right\)\>" - syntax match texMathDelimMod contained "\%#=1\\[bB]igg\?[lr]\?\>" - syntax match texMathDelim contained "\%#=1\\[{}]" + syntax match texMathDelimMod contained "\%#=1\\\%(left\|right\)\>" display + syntax match texMathDelimMod contained "\%#=1\\[bB]igg\?[lr]\?\>" display + syntax match texMathDelim contained "\%#=1\\[{}]" display syntax match texMathDelim contained "\%#=1\v\\%( \[lr]%([vV]ert|angle|brace|ceil|floor|group|moustache) \|backslash \|[uU]%(down)?parrow \|[dD]ownarrow - \)>" + \)>" display if !g:vimtex_syntax_conceal.math_delimiters || &encoding !=# 'utf-8' return From 447155736913c5e1f2b37774c06c858e2ffba706 Mon Sep 17 00:00:00 2001 From: Carlos Esparza Date: Sun, 29 Sep 2024 19:02:01 -0700 Subject: [PATCH 9/9] doc: document performance tricks --- autoload/vimtex/syntax/core.vim | 55 ++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/autoload/vimtex/syntax/core.vim b/autoload/vimtex/syntax/core.vim index 58b532b18ac..a5c860e4148 100644 --- a/autoload/vimtex/syntax/core.vim +++ b/autoload/vimtex/syntax/core.vim @@ -7,6 +7,38 @@ " This script has a lot of unicode characters (for conceals) scriptencoding utf-8 +" ============================= performance tips ============================= +" +" Due to the way (neo)vim implements syntax highlighting, having hundreds of +" different `syntax match ...` (like this file does) results in poor +" performance. To minimize the performance impact, it is better to prefer few +" syntax rules (called syntax items in the vim docs) with complicated regexes +" over many rules with simple regexes. E.g. +" +" syntax match texMathCmdStyle "\\math\%(rm\|tt\|normal\|sf\)\>" +" +" is faster than +" +" syntax match texMathCmdStyle "\\mathrm\>" +" syntax match texMathCmdStyle "\\mathtt\>" +" syntax match texMathCmdStyle "\\mathnormal\>" +" syntax match texMathCmdStyle "\\mathsf\>" +" +" In addition, as of the time of writing (Summer 2024), it seems like +" (neo)vim's backtracking regex engine is faster than the NFA engine for all +" regexes that aren't just literal strings (contrary to the advertising in +" :h two-engines). This is why this syntax file manually sets the old engine +" for most complicated regexes. +" +" Finally, syntax rules that don't "interact" with other rules should be +" marked as "display". See :h :syn-display for details. +" +" IF YOU WANT TO ADD NEW SYNTAX GROUP FOR A MATH-MODE COMMAND: +" Don't add it to the texClusterMath cluster, but to _texMathBackslash. +" Read the comment before the definition of texClusterMath for details. + + + function! vimtex#syntax#core#init_rules() abort " {{{1 " Operators and similar syntax match texMathOper "\%#=1[-+=/<>|]" contained display @@ -24,9 +56,19 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 \texOptSep, \@NoSpell - " texSpecialChar needs to be included because of "~" - " texTabularChar needs to be included because of "&" - " texCmdGreek and texMathSymbol need to be included because of unicode + " The following syntax cluster defines which syntax patterns are allowed to + " appear in math mode. Syntax patterns that always start with a backslash + " (e.g. texMathCmd) should be put in the cluster _texMathBackslash instead. + " This speeds up syntax highlighting, because vim won't try to match other + " patterns at positions where it encounters a backslash in math mode. + + " The following patterns sometimes start with a backslash and sometimes + " don't, so they appear in texClusterMath and in _texMathBackslash: + " texSpecialChar (can match "~") + " texTabularChar (can match "&") + " texComment (can be started by \ifffalse) + " texCmdGreek, texMathSymbol (can match unicode symbols) + " texMathDelim (can e.g. match "(" or "\lvert") syntax cluster texClusterMath contains= \texComment, \texGroupError, @@ -657,10 +699,7 @@ function! vimtex#syntax#core#init_rules() abort " {{{1 let b:current_syntax = 'tex' - " note: texCmdGreek and texMathSymbol also need to be included again - " in texClusterMath because of unicode - " texComment needs to be included here because of \iffalse - " texSpecialChar, texTabularChar and texMathDelim also appear in both lists + " see the definition of texClusterMath for an explanation of what this does syntax match _texMathBackslash "\\"me=e-1 contained nextgroup= \texComment, \texSpecialChar, @@ -694,6 +733,8 @@ function! vimtex#syntax#core#init_post() abort " {{{1 let b:vimtex_syntax_did_postinit = 1 " Add texTheoremEnvBgn for custom theorems + " creating a single big syntax rule instead of separate rules for every + " custom theorem results in faster syntax highlighting. execute 'syntax match texTheoremEnvBgn' \ '"\%#=1\\begin{\%(' .. join(s:gather_newtheorems(), '\|') ..'\)}"' \ 'nextgroup=texTheoremEnvOpt skipwhite skipnl'