mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			345 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			345 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim syntax file | ||
|  | " Language:	XML | ||
|  | " Maintainer:	Johannes Zellner <johannes@zellner.org> | ||
|  | "		Author and previous maintainer: | ||
|  | "		Paul Siegmann <pauls@euronet.nl> | ||
|  | " Last Change:	Fri, 04 Jun 2004 10:41:54 CEST | ||
|  | " Filenames:	*.xml | ||
|  | " $Id$ | ||
|  | 
 | ||
|  | " 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 | ||
|  | 
 | ||
|  | " mark illegal characters | ||
|  | syn match xmlError "[<&]" | ||
|  | 
 | ||
|  | " strings (inside tags) aka VALUES | ||
|  | " | ||
|  | " EXAMPLE: | ||
|  | " | ||
|  | " <tag foo.attribute = "value"> | ||
|  | "                      ^^^^^^^ | ||
|  | syn region  xmlString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=xmlEntity display | ||
|  | syn region  xmlString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=xmlEntity 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 | ||
|  |     \ +[-'"<]\@<!\<[a-zA-Z:_][-.0-9a-zA-Z0-9:_]*\>\(['">]\@!\|$\)+ | ||
|  |     \ contained | ||
|  |     \ contains=xmlAttribPunct,@xmlAttribHook | ||
|  |     \ display | ||
|  | 
 | ||
|  | 
 | ||
|  | " namespace spec | ||
|  | " | ||
|  | " PROVIDES: @xmlNamespaceHook | ||
|  | " | ||
|  | " EXAMPLE: | ||
|  | " | ||
|  | " <xsl:for-each select = "lola"> | ||
|  | "  ^^^ | ||
|  | " | ||
|  | if exists("g:xml_namespace_transparent") | ||
|  | syn match   xmlNamespace | ||
|  |     \ +\(<\|</\)\@<=[^ /!?<>"':]\+[:]\@=+ | ||
|  |     \ contained | ||
|  |     \ contains=@xmlNamespaceHook | ||
|  |     \ transparent | ||
|  |     \ display | ||
|  | else | ||
|  | syn match   xmlNamespace | ||
|  |     \ +\(<\|</\)\@<=[^ /!?<>"':]\+[:]\@=+ | ||
|  |     \ contained | ||
|  |     \ contains=@xmlNamespaceHook | ||
|  |     \ display | ||
|  | endif | ||
|  | 
 | ||
|  | 
 | ||
|  | " tag name | ||
|  | " | ||
|  | " PROVIDES: @xmlTagHook | ||
|  | " | ||
|  | " EXAMPLE: | ||
|  | " | ||
|  | " <tag foo.attribute = "value"> | ||
|  | "  ^^^ | ||
|  | " | ||
|  | syn match   xmlTagName | ||
|  |     \ +[<]\@<=[^ /!?<>"']\++ | ||
|  |     \ 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 match   xmlEndTag | ||
|  | 	\ +</[^ /!?<>"']\+>+ | ||
|  | 	\ contained | ||
|  | 	\ contains=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\{-}>+ | ||
|  | 	\ matchgroup=xmlEndTag end=+/>+ | ||
|  | 	\ fold | ||
|  | 	\ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook | ||
|  | 	\ 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 match   xmlEndTag | ||
|  | 	\ +</[^ /!?<>"']\+>+ | ||
|  | 	\ contains=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=xmlCommentPart,xmlCommentError | ||
|  | 	\ extend | ||
|  | 	\ fold | ||
|  | 
 | ||
|  | else | ||
|  | 
 | ||
|  |     " no syntax folding: | ||
|  |     " - fold attribute removed | ||
|  |     " | ||
|  |     syn region  xmlComment | ||
|  | 	\ start=+<!+ | ||
|  | 	\ end=+>+ | ||
|  | 	\ contains=xmlCommentPart,xmlCommentError | ||
|  | 	\ extend | ||
|  | 
 | ||
|  | endif | ||
|  | 
 | ||
|  | syn keyword xmlTodo         contained TODO FIXME XXX display | ||
|  | syn match   xmlCommentError contained "[^><!]" | ||
|  | syn region  xmlCommentPart | ||
|  |     \ start=+--+ | ||
|  |     \ end=+--+ | ||
|  |     \ contained | ||
|  |     \ contains=xmlTodo,@xmlCommentHook | ||
|  | 
 | ||
|  | 
 | ||
|  | " CData sections | ||
|  | " | ||
|  | " PROVIDES: @xmlCdataHook | ||
|  | " | ||
|  | syn region    xmlCdata | ||
|  |     \ start=+<!\[CDATA\[+ | ||
|  |     \ end=+]]>+ | ||
|  |     \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook | ||
|  |     \ 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 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 |