runtime(xml): Update xml syntax file
Commit:
https://github.com/vim/vim/commit/d859e128a8c8d563d9f4f90d15361bce260f0962
Author: Christian Brabandt <
c...@256bit.org>
Date: Wed Jul 1 20:53:52 2026 +0000
runtime(xml): Update xml syntax file
Improve performance
related: chrisbra/vim-xml-runtime#36
Co-Authored-by: Dmytro Meleshko <
dmytro....@gmail.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim
index d99f8b467..9b97c4fd7 100644
--- a/runtime/syntax/xml.vim
+++ b/runtime/syntax/xml.vim
@@ -4,13 +4,14 @@
" Repository:
https://github.com/chrisbra/vim-xml-ftplugin
" Previous Maintainer: Johannes Zellner <
joha...@zellner.org>
" Author: Paul Siegmann <
pa...@euronet.nl>
-" Last Changed: Nov 03, 2019
+" Last Changed: 30 Jun 2026
" Filenames: *.xml
" Last Change:
" 20190923 - Fix xmlEndTag to match xmlTag (vim/vim#884)
" 20190924 - Fix xmlAttribute property (amadeus/vim-xml@d8ce1c946)
" 20191103 - Enable spell checking globally
" 20210428 - Improve syntax synchronizing
+" 20260630 - Improve performance
" CONFIGURATION:
" syntax folding can be turned on by
@@ -61,7 +62,8 @@ syn case match
syn spell toplevel
" mark illegal characters
-syn match xmlError "[<&]"
+syn match xmlError "<"
+syn match xmlError "&"
" strings (inside tags) aka VALUES
"
@@ -92,12 +94,18 @@ syn match xmlEqual +=+ display
" ^^^^^^^^^^^^^
"
syn match xmlAttrib
- \ +[-'"<]\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>\%(['"]\@!\|$\)+
+ \ +\%#=1[-/!?<>"']\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>['"]\@!+
\ contained
\ contains=xmlAttribPunct,@xmlAttribHook
\ display
+if exists("g:xml_namespace_transparent")
+ command! -nargs=+ XmlTransparent <args> transparent
+else
+ command! -nargs=+ XmlTransparent <args>
+endif
+
" namespace spec
"
" PROVIDES: @xmlNamespaceHook
@@ -107,20 +115,18 @@ syn match xmlAttrib
" <xsl:for-each select = "lola">
" ^^^
"
-if exists("g:xml_namespace_transparent")
-syn match xmlNamespace
- \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+
+XmlTransparent syn match xmlNamespace
+ \ +<[^ /!?<>"':]\+\ze:+lc=1
\ contained
\ contains=@xmlNamespaceHook
- \ transparent
\ display
-else
-syn match xmlNamespace
- \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+
+XmlTransparent syn match xmlNamespace
+ \ +</[^ /!?<>"':]\+\ze:+lc=2
\ contained
\ contains=@xmlNamespaceHook
\ display
-endif
+
+delcommand XmlTransparent
" tag name
@@ -133,47 +139,60 @@ endif
" ^^^
"
syn match xmlTagName
- \ +\%(<\|</\)\@2<=[^ /!?<>"']\++
+ \ +<[^ /!?<>"']\++lc=1
+ \ contained
+ \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
+ \ display
+syn match xmlTagName
+ \ +</[^ /!?<>"']\++lc=2
\ contained
\ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
\ display
if exists('g:xml_syntax_folding')
+ command! -nargs=+ XmlContained <args> contained
+ command! -nargs=+ XmlFold <args> fold
+else
+ command! -nargs=+ XmlContained <args>
+ command! -nargs=+ XmlFold <args>
+endif
- " start tag
- " use matchgroup=xmlTag to skip over the leading '<'
- "
- " PROVIDES: @xmlStartTagHook
- "
- " EXAMPLE:
- "
- " <tag id="whoops">
- " s^^^^^^^^^^^^^^^e
- "
- syn region xmlTag
- \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
+" start tag
+" use matchgroup=xmlTag to skip over the leading '<'
+"
+" PROVIDES: @xmlStartTagHook
+"
+" EXAMPLE:
+"
+" <tag id="whoops">
+" s^^^^^^^^^^^^^^^e
+"
+XmlContained syn region xmlTag
+ \ matchgroup=xmlTag start=+<\ze[^ /!?<>"']+
\ matchgroup=xmlTag end=+>+
- \ contained
\ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
- " highlight the end tag
- "
- " PROVIDES: @xmlTagHook
- " (should we provide a separate @xmlEndTagHook ?)
- "
- " EXAMPLE:
- "
- " </tag>
- " ^^^^^^
- "
- syn region xmlEndTag
- \ matchgroup=xmlTag start=+</[^ /!?<>"']\@=+
+" highlight the end tag
+"
+" PROVIDES: @xmlTagHook
+" (should we provide a separate @xmlEndTagHook ?)
+"
+" EXAMPLE:
+"
+" </tag>
+" ^^^^^^
+"
+XmlContained syn region xmlEndTag
+ \ matchgroup=xmlTag start=+</\ze[^ /!?<>"']+
\ matchgroup=xmlTag end=+>+
- \ contained
\ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook
+delcommand XmlContained
+
+
+if exists('g:xml_syntax_folding')
" tag elements with syntax-folding.
" NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements
"
@@ -197,23 +216,6 @@ if exists('g:xml_syntax_folding')
\ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell
\ keepend
\ extend
-
-else
-
- " no syntax folding:
- " - contained attribute removed
- " - xmlRegion not defined
- "
- syn region xmlTag
- \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
- \ matchgroup=xmlTag end=+>+
- \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
-
- syn region xmlEndTag
- \ matchgroup=xmlTag start=+</[^ /!?<>"']\@=+
- \ matchgroup=xmlTag end=+>+
- \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook
-
endif
@@ -221,30 +223,14 @@ endif
syn match xmlEntity "&[^; ]*;" contains=xmlEntityPunct
syn match xmlEntityPunct contained "[&.;]"
-if exists('g:xml_syntax_folding')
-
- " The real comments (this implements the comments as defined by xml,
- " but not all xml pages actually conform to it. Errors are flagged.
- syn region xmlComment
- \ start=+<!+
- \ end=+>+
- \ contains=xmlCommentStart,xmlCommentError
- \ extend
- \ fold
-
-else
-
- " no syntax folding:
- " - fold attribute removed
- "
- syn region xmlComment
+" The real comments (this implements the comments as defined by xml,
+" but not all xml pages actually conform to it. Errors are flagged.
+XmlFold syn region xmlComment
\ start=+<!+
\ end=+>+
\ contains=xmlCommentStart,xmlCommentError
\ extend
-endif
-
syn match xmlCommentStart contained "<!" nextgroup=xmlCommentPart
syn keyword xmlTodo contained TODO FIXME XXX
syn match xmlCommentError contained "[^><!]"
@@ -278,23 +264,12 @@ syn match xmlCdataEnd +]]>+ contained
syn region xmlProcessing matchgroup=xmlProcessingDelim start="<?" end="?>" contains=xmlAttrib,xmlEqual,xmlString
-if exists('g:xml_syntax_folding')
-
- " DTD -- we use dtd.vim here
- syn region xmlDocType matchgroup=xmlDocTypeDecl
+" DTD -- we use dtd.vim here
+XmlFold syn region xmlDocType matchgroup=xmlDocTypeDecl
\ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
- \ fold
\ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
-else
- " no syntax folding:
- " - fold attribute removed
- "
- syn region xmlDocType matchgroup=xmlDocTypeDecl
- \ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
- \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
-
-endif
+delcommand XmlFold
syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM
syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD