Mercurial > vim
annotate runtime/syntax/xml.vim @ 6520:70793fedd25a v7.4.587
updated for version 7.4.587
Problem: Conceal does not work properly with 'linebreak'. (cs86661)
Solution: Save and restore boguscols. (Christian Brabandt)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 20 Jan 2015 19:01:35 +0100 |
parents | a5352e73dc00 |
children | 6d11fc4aa683 |
rev | line source |
---|---|
7 | 1 " Vim syntax file |
2 " Language: XML | |
3 " Maintainer: Johannes Zellner <johannes@zellner.org> | |
4 " Author and previous maintainer: | |
5 " Paul Siegmann <pauls@euronet.nl> | |
4869 | 6 " Last Change: 2013 Jun 07 |
7 | 7 " Filenames: *.xml |
2034 | 8 " $Id: xml.vim,v 1.3 2006/04/11 21:32:00 vimboss Exp $ |
7 | 9 |
10 " CONFIGURATION: | |
11 " syntax folding can be turned on by | |
12 " | |
13 " let g:xml_syntax_folding = 1 | |
14 " | |
15 " before the syntax file gets loaded (e.g. in ~/.vimrc). | |
16 " This might slow down syntax highlighting significantly, | |
17 " especially for large files. | |
18 " | |
19 " CREDITS: | |
20 " The original version was derived by Paul Siegmann from | |
21 " Claudio Fleiner's html.vim. | |
22 " | |
23 " REFERENCES: | |
24 " [1] http://www.w3.org/TR/2000/REC-xml-20001006 | |
25 " [2] http://www.w3.org/XML/1998/06/xmlspec-report-19980910.htm | |
26 " | |
27 " as <hirauchi@kiwi.ne.jp> pointed out according to reference [1] | |
28 " | |
29 " 2.3 Common Syntactic Constructs | |
30 " [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender | |
31 " [5] Name ::= (Letter | '_' | ':') (NameChar)* | |
32 " | |
33 " NOTE: | |
34 " 1) empty tag delimiters "/>" inside attribute values (strings) | |
35 " confuse syntax highlighting. | |
36 " 2) for large files, folding can be pretty slow, especially when | |
37 " loading a file the first time and viewoptions contains 'folds' | |
38 " so that folds of previous sessions are applied. | |
39 " Don't use 'foldmethod=syntax' in this case. | |
40 | |
41 | |
42 " Quit when a syntax file was already loaded | |
43 if exists("b:current_syntax") | |
44 finish | |
45 endif | |
46 | |
47 let s:xml_cpo_save = &cpo | |
48 set cpo&vim | |
49 | |
50 syn case match | |
51 | |
52 " mark illegal characters | |
53 syn match xmlError "[<&]" | |
54 | |
55 " strings (inside tags) aka VALUES | |
56 " | |
57 " EXAMPLE: | |
58 " | |
59 " <tag foo.attribute = "value"> | |
60 " ^^^^^^^ | |
826 | 61 syn region xmlString contained start=+"+ end=+"+ contains=xmlEntity,@Spell display |
62 syn region xmlString contained start=+'+ end=+'+ contains=xmlEntity,@Spell display | |
7 | 63 |
64 | |
65 " punctuation (within attributes) e.g. <tag xml:foo.attribute ...> | |
66 " ^ ^ | |
67 " syn match xmlAttribPunct +[-:._]+ contained display | |
68 syn match xmlAttribPunct +[:.]+ contained display | |
69 | |
70 " no highlighting for xmlEqual (xmlEqual has no highlighting group) | |
71 syn match xmlEqual +=+ display | |
72 | |
73 | |
74 " attribute, everything before the '=' | |
75 " | |
76 " PROVIDES: @xmlAttribHook | |
77 " | |
78 " EXAMPLE: | |
79 " | |
80 " <tag foo.attribute = "value"> | |
81 " ^^^^^^^^^^^^^ | |
82 " | |
83 syn match xmlAttrib | |
4869 | 84 \ +[-'"<]\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>\%(['">]\@!\|$\)+ |
7 | 85 \ contained |
86 \ contains=xmlAttribPunct,@xmlAttribHook | |
87 \ display | |
88 | |
89 | |
90 " namespace spec | |
91 " | |
92 " PROVIDES: @xmlNamespaceHook | |
93 " | |
94 " EXAMPLE: | |
95 " | |
96 " <xsl:for-each select = "lola"> | |
97 " ^^^ | |
98 " | |
99 if exists("g:xml_namespace_transparent") | |
100 syn match xmlNamespace | |
4681
2eb30f341e8d
Updated runtime files and translations.
Bram Moolenaar <bram@vim.org>
parents:
2034
diff
changeset
|
101 \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+ |
7 | 102 \ contained |
103 \ contains=@xmlNamespaceHook | |
104 \ transparent | |
105 \ display | |
106 else | |
107 syn match xmlNamespace | |
4681
2eb30f341e8d
Updated runtime files and translations.
Bram Moolenaar <bram@vim.org>
parents:
2034
diff
changeset
|
108 \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+ |
7 | 109 \ contained |
110 \ contains=@xmlNamespaceHook | |
111 \ display | |
112 endif | |
113 | |
114 | |
115 " tag name | |
116 " | |
117 " PROVIDES: @xmlTagHook | |
118 " | |
119 " EXAMPLE: | |
120 " | |
121 " <tag foo.attribute = "value"> | |
122 " ^^^ | |
123 " | |
124 syn match xmlTagName | |
4869 | 125 \ +<\@1<=[^ /!?<>"']\++ |
7 | 126 \ contained |
127 \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook | |
128 \ display | |
129 | |
130 | |
131 if exists('g:xml_syntax_folding') | |
132 | |
133 " start tag | |
134 " use matchgroup=xmlTag to skip over the leading '<' | |
135 " | |
136 " PROVIDES: @xmlStartTagHook | |
137 " | |
138 " EXAMPLE: | |
139 " | |
140 " <tag id="whoops"> | |
141 " s^^^^^^^^^^^^^^^e | |
142 " | |
143 syn region xmlTag | |
144 \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ | |
145 \ matchgroup=xmlTag end=+>+ | |
146 \ contained | |
147 \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook | |
148 | |
149 | |
150 " highlight the end tag | |
151 " | |
152 " PROVIDES: @xmlTagHook | |
153 " (should we provide a separate @xmlEndTagHook ?) | |
154 " | |
155 " EXAMPLE: | |
156 " | |
157 " </tag> | |
158 " ^^^^^^ | |
159 " | |
160 syn match xmlEndTag | |
161 \ +</[^ /!?<>"']\+>+ | |
162 \ contained | |
163 \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook | |
164 | |
165 | |
166 " tag elements with syntax-folding. | |
167 " NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements | |
168 " | |
169 " PROVIDES: @xmlRegionHook | |
170 " | |
171 " EXAMPLE: | |
172 " | |
173 " <tag id="whoops"> | |
174 " <!-- comment --> | |
175 " <another.tag></another.tag> | |
176 " <empty.tag/> | |
177 " some data | |
178 " </tag> | |
179 " | |
180 syn region xmlRegion | |
181 \ start=+<\z([^ /!?<>"']\+\)+ | |
182 \ skip=+<!--\_.\{-}-->+ | |
183 \ end=+</\z1\_\s\{-}>+ | |
184 \ matchgroup=xmlEndTag end=+/>+ | |
185 \ fold | |
826 | 186 \ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell |
7 | 187 \ keepend |
188 \ extend | |
189 | |
190 else | |
191 | |
192 " no syntax folding: | |
193 " - contained attribute removed | |
194 " - xmlRegion not defined | |
195 " | |
196 syn region xmlTag | |
197 \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+ | |
198 \ matchgroup=xmlTag end=+>+ | |
199 \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook | |
200 | |
201 syn match xmlEndTag | |
202 \ +</[^ /!?<>"']\+>+ | |
203 \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook | |
204 | |
205 endif | |
206 | |
207 | |
208 " &entities; compare with dtd | |
209 syn match xmlEntity "&[^; \t]*;" contains=xmlEntityPunct | |
210 syn match xmlEntityPunct contained "[&.;]" | |
211 | |
212 if exists('g:xml_syntax_folding') | |
213 | |
214 " The real comments (this implements the comments as defined by xml, | |
215 " but not all xml pages actually conform to it. Errors are flagged. | |
216 syn region xmlComment | |
217 \ start=+<!+ | |
218 \ end=+>+ | |
2034 | 219 \ contains=xmlCommentStart,xmlCommentError |
7 | 220 \ extend |
221 \ fold | |
222 | |
223 else | |
224 | |
225 " no syntax folding: | |
226 " - fold attribute removed | |
227 " | |
228 syn region xmlComment | |
229 \ start=+<!+ | |
230 \ end=+>+ | |
2034 | 231 \ contains=xmlCommentStart,xmlCommentError |
7 | 232 \ extend |
233 | |
234 endif | |
235 | |
2034 | 236 syn match xmlCommentStart contained "<!" nextgroup=xmlCommentPart |
236 | 237 syn keyword xmlTodo contained TODO FIXME XXX |
7 | 238 syn match xmlCommentError contained "[^><!]" |
239 syn region xmlCommentPart | |
240 \ start=+--+ | |
241 \ end=+--+ | |
242 \ contained | |
826 | 243 \ contains=xmlTodo,@xmlCommentHook,@Spell |
7 | 244 |
245 | |
246 " CData sections | |
247 " | |
248 " PROVIDES: @xmlCdataHook | |
249 " | |
250 syn region xmlCdata | |
251 \ start=+<!\[CDATA\[+ | |
252 \ end=+]]>+ | |
826 | 253 \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook,@Spell |
7 | 254 \ keepend |
255 \ extend | |
256 | |
257 " using the following line instead leads to corrupt folding at CDATA regions | |
258 " syn match xmlCdata +<!\[CDATA\[\_.\{-}]]>+ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook | |
259 syn match xmlCdataStart +<!\[CDATA\[+ contained contains=xmlCdataCdata | |
260 syn keyword xmlCdataCdata CDATA contained | |
261 syn match xmlCdataEnd +]]>+ contained | |
262 | |
263 | |
264 " Processing instructions | |
265 " This allows "?>" inside strings -- good idea? | |
266 syn region xmlProcessing matchgroup=xmlProcessingDelim start="<?" end="?>" contains=xmlAttrib,xmlEqual,xmlString | |
267 | |
268 | |
269 if exists('g:xml_syntax_folding') | |
270 | |
271 " DTD -- we use dtd.vim here | |
272 syn region xmlDocType matchgroup=xmlDocTypeDecl | |
273 \ start="<!DOCTYPE"he=s+2,rs=s+2 end=">" | |
274 \ fold | |
275 \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString | |
276 else | |
277 | |
278 " no syntax folding: | |
279 " - fold attribute removed | |
280 " | |
281 syn region xmlDocType matchgroup=xmlDocTypeDecl | |
282 \ start="<!DOCTYPE"he=s+2,rs=s+2 end=">" | |
283 \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString | |
284 | |
285 endif | |
286 | |
287 syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM | |
288 syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD | |
289 syn include @xmlDTD <sfile>:p:h/dtd.vim | |
290 unlet b:current_syntax | |
291 | |
292 | |
293 " synchronizing | |
294 " TODO !!! to be improved !!! | |
295 | |
296 syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+ | |
297 " syn sync match xmlSyncDT groupthere NONE +]>+ | |
298 | |
299 if exists('g:xml_syntax_folding') | |
300 syn sync match xmlSync grouphere xmlRegion +\_.\(<[^ /!?<>"']\+\)\@=+ | |
301 " syn sync match xmlSync grouphere xmlRegion "<[^ /!?<>"']*>" | |
302 syn sync match xmlSync groupthere xmlRegion +</[^ /!?<>"']\+>+ | |
303 endif | |
304 | |
305 syn sync minlines=100 | |
306 | |
307 | |
308 " The default highlighting. | |
309 hi def link xmlTodo Todo | |
310 hi def link xmlTag Function | |
311 hi def link xmlTagName Function | |
312 hi def link xmlEndTag Identifier | |
313 if !exists("g:xml_namespace_transparent") | |
314 hi def link xmlNamespace Tag | |
315 endif | |
316 hi def link xmlEntity Statement | |
317 hi def link xmlEntityPunct Type | |
318 | |
319 hi def link xmlAttribPunct Comment | |
320 hi def link xmlAttrib Type | |
321 | |
322 hi def link xmlString String | |
323 hi def link xmlComment Comment | |
2034 | 324 hi def link xmlCommentStart xmlComment |
7 | 325 hi def link xmlCommentPart Comment |
326 hi def link xmlCommentError Error | |
327 hi def link xmlError Error | |
328 | |
329 hi def link xmlProcessingDelim Comment | |
330 hi def link xmlProcessing Type | |
331 | |
332 hi def link xmlCdata String | |
333 hi def link xmlCdataCdata Statement | |
334 hi def link xmlCdataStart Type | |
335 hi def link xmlCdataEnd Type | |
336 | |
337 hi def link xmlDocTypeDecl Function | |
338 hi def link xmlDocTypeKeyword Statement | |
339 hi def link xmlInlineDTD Function | |
340 | |
341 let b:current_syntax = "xml" | |
342 | |
343 let &cpo = s:xml_cpo_save | |
344 unlet s:xml_cpo_save | |
345 | |
346 " vim: ts=8 |