mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			358 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" 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
 | 
						|
 | 
						|
" 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
 | 
						|
" TODO !!! to be improved !!!
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
" 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=8
 |