diff options
Diffstat (limited to 'runtime/syntax/xml.vim')
-rw-r--r-- | runtime/syntax/xml.vim | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim new file mode 100644 index 0000000..d99f8b4 --- /dev/null +++ b/runtime/syntax/xml.vim @@ -0,0 +1,361 @@ +" Vim syntax file +" Language: XML +" Maintainer: Christian Brabandt <cb@256bit.org> +" Repository: https://github.com/chrisbra/vim-xml-ftplugin +" Previous Maintainer: Johannes Zellner <johannes@zellner.org> +" Author: Paul Siegmann <pauls@euronet.nl> +" Last Changed: Nov 03, 2019 +" 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 + +" CONFIGURATION: +" syntax folding can be turned on by +" +" let g:xml_syntax_folding = 1 +" +" before the syntax file gets loaded (e.g. in ~/.vimrc). +" This might slow down syntax highlighting significantly, +" especially for large files. +" +" CREDITS: +" The original version was derived by Paul Siegmann from +" Claudio Fleiner's html.vim. +" +" REFERENCES: +" [1] http://www.w3.org/TR/2000/REC-xml-20001006 +" [2] http://www.w3.org/XML/1998/06/xmlspec-report-19980910.htm +" +" as <hirauchi@kiwi.ne.jp> pointed out according to reference [1] +" +" 2.3 Common Syntactic Constructs +" [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender +" [5] Name ::= (Letter | '_' | ':') (NameChar)* +" +" NOTE: +" 1) empty tag delimiters "/>" inside attribute values (strings) +" confuse syntax highlighting. +" 2) for large files, folding can be pretty slow, especially when +" loading a file the first time and viewoptions contains 'folds' +" so that folds of previous sessions are applied. +" Don't use 'foldmethod=syntax' in this case. + + +" Quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +let s:xml_cpo_save = &cpo +set cpo&vim + +syn case match + +" Allow spell checking in tag values, +" there is no syntax region for that, +" so enable spell checking in top-level elements +" <tag>This text is spell checked</tag> +syn spell toplevel + +" mark illegal characters +syn match xmlError "[<&]" + +" strings (inside tags) aka VALUES +" +" EXAMPLE: +" +" <tag foo.attribute = "value"> +" ^^^^^^^ +syn region xmlString contained start=+"+ end=+"+ contains=xmlEntity,@Spell display +syn region xmlString contained start=+'+ end=+'+ contains=xmlEntity,@Spell display + + +" punctuation (within attributes) e.g. <tag xml:foo.attribute ...> +" ^ ^ +" syn match xmlAttribPunct +[-:._]+ contained display +syn match xmlAttribPunct +[:.]+ contained display + +" no highlighting for xmlEqual (xmlEqual has no highlighting group) +syn match xmlEqual +=+ display + + +" attribute, everything before the '=' +" +" PROVIDES: @xmlAttribHook +" +" EXAMPLE: +" +" <tag foo.attribute = "value"> +" ^^^^^^^^^^^^^ +" +syn match xmlAttrib + \ +[-'"<]\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>\%(['"]\@!\|$\)+ + \ contained + \ contains=xmlAttribPunct,@xmlAttribHook + \ display + + +" namespace spec +" +" PROVIDES: @xmlNamespaceHook +" +" EXAMPLE: +" +" <xsl:for-each select = "lola"> +" ^^^ +" +if exists("g:xml_namespace_transparent") +syn match xmlNamespace + \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+ + \ contained + \ contains=@xmlNamespaceHook + \ transparent + \ display +else +syn match xmlNamespace + \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+ + \ contained + \ contains=@xmlNamespaceHook + \ display +endif + + +" tag name +" +" PROVIDES: @xmlTagHook +" +" EXAMPLE: +" +" <tag foo.attribute = "value"> +" ^^^ +" +syn match xmlTagName + \ +\%(<\|</\)\@2<=[^ /!?<>"']\++ + \ contained + \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook + \ display + + +if exists('g:xml_syntax_folding') + + " start tag + " use matchgroup=xmlTag to skip over the leading '<' + " + " PROVIDES: @xmlStartTagHook + " + " EXAMPLE: + " + " <tag id="whoops"> + " s^^^^^^^^^^^^^^^e + " + syn region xmlTag + \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ + \ 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=+</[^ /!?<>"']\@=+ + \ matchgroup=xmlTag end=+>+ + \ contained + \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook + + " tag elements with syntax-folding. + " NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements + " + " PROVIDES: @xmlRegionHook + " + " EXAMPLE: + " + " <tag id="whoops"> + " <!-- comment --> + " <another.tag></another.tag> + " <empty.tag/> + " some data + " </tag> + " + syn region xmlRegion + \ start=+<\z([^ /!?<>"']\+\)+ + \ skip=+<!--\_.\{-}-->+ + \ end=+</\z1\_\s\{-}>+ + \ end=+/>+ + \ fold + \ 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 + + +" &entities; compare with dtd +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 + \ start=+<!+ + \ end=+>+ + \ contains=xmlCommentStart,xmlCommentError + \ extend + \ fold + +else + + " no syntax folding: + " - fold attribute removed + " + 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 "[^><!]" +syn region xmlCommentPart + \ start=+--+ + \ end=+--+ + \ contained + \ contains=xmlTodo,@xmlCommentHook,@Spell + + +" CData sections +" +" PROVIDES: @xmlCdataHook +" +syn region xmlCdata + \ start=+<!\[CDATA\[+ + \ end=+]]>+ + \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook,@Spell + \ keepend + \ extend + +" using the following line instead leads to corrupt folding at CDATA regions +" syn match xmlCdata +<!\[CDATA\[\_.\{-}]]>+ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook +syn match xmlCdataStart +<!\[CDATA\[+ contained contains=xmlCdataCdata +syn keyword xmlCdataCdata CDATA contained +syn match xmlCdataEnd +]]>+ contained + + +" Processing instructions +" This allows "?>" inside strings -- good idea? +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 + \ 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 + +syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM +syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD +syn include @xmlDTD <sfile>:p:h/dtd.vim +unlet b:current_syntax + + +" synchronizing + +syn sync match xmlSyncComment grouphere xmlComment +<!--+ +syn sync match xmlSyncComment groupthere NONE +-->+ + +" The following is slow on large documents (and the doctype is optional +" syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+ +" syn sync match xmlSyncDT groupthere NONE +]>+ + +if exists('g:xml_syntax_folding') + syn sync match xmlSync grouphere xmlRegion +\_.\(<[^ /!?<>"']\+\)\@=+ + " syn sync match xmlSync grouphere xmlRegion "<[^ /!?<>"']*>" + syn sync match xmlSync groupthere xmlRegion +</[^ /!?<>"']\+>+ +endif + +syn sync minlines=100 maxlines=200 + + +" The default highlighting. +hi def link xmlTodo Todo +hi def link xmlTag Function +hi def link xmlTagName Function +hi def link xmlEndTag Identifier +if !exists("g:xml_namespace_transparent") + hi def link xmlNamespace Tag +endif +hi def link xmlEntity Statement +hi def link xmlEntityPunct Type + +hi def link xmlAttribPunct Comment +hi def link xmlAttrib Type + +hi def link xmlString String +hi def link xmlComment Comment +hi def link xmlCommentStart xmlComment +hi def link xmlCommentPart Comment +hi def link xmlCommentError Error +hi def link xmlError Error + +hi def link xmlProcessingDelim Comment +hi def link xmlProcessing Type + +hi def link xmlCdata String +hi def link xmlCdataCdata Statement +hi def link xmlCdataStart Type +hi def link xmlCdataEnd Type + +hi def link xmlDocTypeDecl Function +hi def link xmlDocTypeKeyword Statement +hi def link xmlInlineDTD Function + +let b:current_syntax = "xml" + +let &cpo = s:xml_cpo_save +unlet s:xml_cpo_save + +" vim: ts=4 |