123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- " 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
|