diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim index d99f8b467a..9b97c4fd7f 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 " Author: Paul Siegmann -" 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\%(['"]\@!\|$\)+ + \ +\%#=1[-/!?<>"']\@1['"]\@!+ \ contained \ contains=xmlAttribPunct,@xmlAttribHook \ display +if exists("g:xml_namespace_transparent") + command! -nargs=+ XmlTransparent transparent +else + command! -nargs=+ XmlTransparent +endif + " namespace spec " " PROVIDES: @xmlNamespaceHook @@ -107,20 +115,18 @@ syn match xmlAttrib " " ^^^ " -if exists("g:xml_namespace_transparent") -syn match xmlNamespace - \ +\(<\|"':]\+[:]\@=+ - \ contained - \ contains=@xmlNamespaceHook - \ transparent - \ display -else -syn match xmlNamespace - \ +\(<\|"':]\+[:]\@=+ +XmlTransparent syn match xmlNamespace + \ +<[^ /!?<>"':]\+\ze:+lc=1 \ contained \ contains=@xmlNamespaceHook \ display -endif +XmlTransparent syn match xmlNamespace + \ +"':]\+\ze:+lc=2 + \ contained + \ contains=@xmlNamespaceHook + \ display + +delcommand XmlTransparent " tag name @@ -133,47 +139,60 @@ endif " ^^^ " syn match xmlTagName - \ +\%(<\|"']\++ + \ +<[^ /!?<>"']\++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 contained + command! -nargs=+ XmlFold fold +else + command! -nargs=+ XmlContained + command! -nargs=+ XmlFold +endif - " start tag - " use matchgroup=xmlTag to skip over the leading '<' - " - " PROVIDES: @xmlStartTagHook - " - " EXAMPLE: - " - " - " s^^^^^^^^^^^^^^^e - " - syn region xmlTag - \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ +" start tag +" use matchgroup=xmlTag to skip over the leading '<' +" +" PROVIDES: @xmlStartTagHook +" +" EXAMPLE: +" +" +" 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: - " - " - " ^^^^^^ - " - syn region xmlEndTag - \ matchgroup=xmlTag start=+"']\@=+ +" highlight the end tag +" +" PROVIDES: @xmlTagHook +" (should we provide a separate @xmlEndTagHook ?) +" +" EXAMPLE: +" +" +" ^^^^^^ +" +XmlContained syn region xmlEndTag + \ matchgroup=xmlTag start=+"']+ \ 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,29 +223,13 @@ endif syn match xmlEntity "&[^; \t]*;" 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 +" 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=++ \ contains=xmlCommentStart,xmlCommentError \ extend - \ fold - -else - - " no syntax folding: - " - fold attribute removed - " - syn region xmlComment - \ start=++ - \ contains=xmlCommentStart,xmlCommentError - \ extend - -endif syn match xmlCommentStart contained "+ contained syn region xmlProcessing matchgroup=xmlProcessingDelim start="" contains=xmlAttrib,xmlEqual,xmlString -if exists('g:xml_syntax_folding') - - " DTD -- we use dtd.vim here - syn region xmlDocType matchgroup=xmlDocTypeDecl - \ start="" - \ fold - \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString -else - - " no syntax folding: - " - fold attribute removed - " - syn region xmlDocType matchgroup=xmlDocTypeDecl +" DTD -- we use dtd.vim here +XmlFold syn region xmlDocType matchgroup=xmlDocTypeDecl \ start="" \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString -endif +delcommand XmlFold syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD