html.vim (19729B)
1 " Vim syntax file 2 " Language: HTML 3 " Maintainer: Doug Kearns <dougkearns@gmail.com> 4 " Previous Maintainers: Jorge Maldonado Ventura <jorgesumle@freakspot.net> 5 " Claudio Fleiner <claudio@fleiner.com> 6 " Last Change: 2023 Nov 28 7 " 2024 Jul 30 by Vim Project: increase syn-sync-minlines to 250 8 " 2025 May 10 by Vim Project: update comment 9 10 " See :help html.vim for some comments and a description of the options 11 12 " quit when a syntax file was already loaded 13 if !exists("main_syntax") 14 if exists("b:current_syntax") 15 finish 16 endif 17 let main_syntax = 'html' 18 endif 19 20 let s:cpo_save = &cpo 21 set cpo&vim 22 23 syntax spell toplevel 24 25 syn include @htmlXml syntax/xml.vim 26 unlet b:current_syntax 27 28 syn case ignore 29 30 " mark illegal characters 31 syn match htmlError "[<>&]" 32 33 " tags 34 syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc 35 syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc 36 syn match htmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1 contains=javaScriptExpression,@htmlPreproc 37 syn region htmlEndTag start=+</+ end=+>+ contains=htmlTagN,htmlTagError 38 syn region htmlTag start=+<[^/]+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster 39 syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster 40 syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster 41 syn match htmlTagError contained "[^>]<"ms=s+1 42 43 " tag names 44 syn keyword htmlTagName contained address applet area a base basefont 45 syn keyword htmlTagName contained big blockquote br caption center 46 syn keyword htmlTagName contained cite code dd dfn dir div dl dt font 47 syn keyword htmlTagName contained form hr html img 48 syn keyword htmlTagName contained input isindex kbd li link map menu 49 syn keyword htmlTagName contained meta ol option param pre p samp span 50 syn keyword htmlTagName contained select small strike sub sup 51 syn keyword htmlTagName contained table td textarea th tr tt ul var xmp 52 syn match htmlTagName contained "\<\%(b\|i\|u\|h[1-6]\|em\|strong\|head\|body\|title\)\>" 53 54 " new html 4.0 tags 55 syn keyword htmlTagName contained abbr acronym bdo button col colgroup 56 syn keyword htmlTagName contained del fieldset iframe ins label legend 57 syn keyword htmlTagName contained object optgroup q s tbody tfoot thead 58 59 " new html 5 tags 60 syn keyword htmlTagName contained article aside audio bdi canvas data 61 syn keyword htmlTagName contained datalist details dialog embed figcaption 62 syn keyword htmlTagName contained figure footer header hgroup keygen main 63 syn keyword htmlTagName contained mark menuitem meter nav output picture 64 syn keyword htmlTagName contained progress rb rp rt rtc ruby search section 65 syn keyword htmlTagName contained slot source summary template time track 66 syn keyword htmlTagName contained video wbr 67 68 " svg and math tags 69 syn keyword htmlMathTagName contained math 70 syn keyword htmlSvgTagName contained svg 71 72 syn region htmlMath start="<math>" end="</math>" contains=@htmlXml transparent keepend 73 syn region htmlSvg start="<svg>" end="</svg>" contains=@htmlXml transparent keepend 74 75 syn cluster xmlTagHook add=htmlMathTagName,htmlSvgTagName 76 77 " legal arg names 78 syn keyword htmlArg contained action 79 syn keyword htmlArg contained align alink alt archive background bgcolor 80 syn keyword htmlArg contained border bordercolor cellpadding 81 syn keyword htmlArg contained cellspacing checked class clear code codebase color 82 syn keyword htmlArg contained cols colspan content coords enctype face 83 syn keyword htmlArg contained gutter height hspace id 84 syn keyword htmlArg contained link lowsrc marginheight 85 syn keyword htmlArg contained marginwidth maxlength method name prompt 86 syn keyword htmlArg contained rel rev rows rowspan scrolling selected shape 87 syn keyword htmlArg contained size src start target text type url 88 syn keyword htmlArg contained usemap ismap valign value vlink vspace width wrap 89 syn match htmlArg contained "\<\%(http-equiv\|href\|title\)="me=e-1 90 91 syn keyword htmlArg contained role 92 93 " ARIA attributes {{{1 94 let s:aria =<< trim END 95 activedescendant 96 atomic 97 autocomplete 98 braillelabel 99 brailleroledescription 100 busy 101 checked 102 colcount 103 colindex 104 colindextext 105 colspan 106 controls 107 current 108 describedby 109 description 110 details 111 disabled 112 errormessage 113 expanded 114 flowto 115 haspopup 116 hidden 117 invalid 118 keyshortcuts 119 label 120 labelledby 121 level 122 live 123 modal 124 multiline 125 multiselectable 126 orientation 127 owns 128 placeholder 129 posinset 130 pressed 131 readonly 132 relevant 133 required 134 roledescription 135 rowcount 136 rowindex 137 rowindextext 138 rowspan 139 selected 140 setsize 141 sort 142 valuemax 143 valuemin 144 valuenow 145 valuetext 146 END 147 let s:aria_deprecated =<< trim END 148 dropeffect 149 grabbed 150 END 151 152 call extend(s:aria, s:aria_deprecated) 153 exe 'syn match htmlArg contained "\%#=1\<aria-\%(' .. s:aria->join('\|') .. '\)\>"' 154 unlet s:aria s:aria_deprecated 155 " }}} 156 157 " Netscape extensions 158 syn keyword htmlTagName contained frame noframes frameset nobr blink 159 syn keyword htmlTagName contained layer ilayer nolayer spacer 160 syn keyword htmlArg contained frameborder noresize pagex pagey above below 161 syn keyword htmlArg contained left top visibility clip id noshade 162 syn match htmlArg contained "\<z-index\>" 163 164 " Microsoft extensions 165 syn keyword htmlTagName contained marquee 166 167 " html 4.0 arg names 168 syn match htmlArg contained "\<\%(accept-charset\|label\)\>" 169 syn keyword htmlArg contained abbr accept accesskey axis char charoff charset 170 syn keyword htmlArg contained cite classid codetype compact data datetime 171 syn keyword htmlArg contained declare defer dir disabled for frame 172 syn keyword htmlArg contained headers hreflang lang language longdesc 173 syn keyword htmlArg contained multiple nohref nowrap object profile readonly 174 syn keyword htmlArg contained rules scheme scope span standby style 175 syn keyword htmlArg contained summary tabindex valuetype version 176 177 " html 5 arg names 178 syn keyword htmlArg contained allow autocapitalize as blocking decoding 179 syn keyword htmlArg contained enterkeyhint imagesizes imagesrcset inert 180 syn keyword htmlArg contained integrity is itemid itemprop itemref itemscope 181 syn keyword htmlArg contained itemtype loading nomodule ping playsinline 182 syn keyword htmlArg contained referrerpolicy slot allowfullscreen async 183 syn keyword htmlArg contained autocomplete autofocus autoplay challenge 184 syn keyword htmlArg contained contenteditable contextmenu controls crossorigin 185 syn keyword htmlArg contained default dirname download draggable dropzone form 186 syn keyword htmlArg contained formaction formenctype formmethod formnovalidate 187 syn keyword htmlArg contained formtarget hidden high icon inputmode keytype 188 syn keyword htmlArg contained kind list loop low max min minlength muted nonce 189 syn keyword htmlArg contained novalidate open optimum pattern placeholder 190 syn keyword htmlArg contained poster preload radiogroup required reversed 191 syn keyword htmlArg contained sandbox spellcheck sizes srcset srcdoc srclang 192 syn keyword htmlArg contained step title translate typemustmatch 193 syn match htmlArg contained "\<data-\h\%(\w\|[-.]\)*\%(\_s*=\)\@=" 194 195 " special characters 196 syn match htmlSpecialChar "&#\=[0-9A-Za-z]\{1,32};" 197 198 " Comments (the real ones or the old netscape ones) 199 if exists("html_wrong_comments") 200 syn region htmlComment start=+<!--+ end=+--\s*>+ contains=@Spell 201 else 202 " The HTML 5.2 syntax 8.2.4.41: bogus comment is parser error; browser skips until next > 203 syn region htmlComment start=+<!+ end=+>+ contains=htmlCommentError keepend 204 " Idem 8.2.4.42,51: Comment starts with <!-- and ends with --> 205 " Idem 8.2.4.43,44: Except <!--> and <!---> are parser errors 206 " Idem 8.2.4.52: dash-dash-bang (--!>) is error ignored by parser, also closes comment 207 syn region htmlComment matchgroup=htmlComment start=+<!--\%(-\?>\)\@!+ end=+--!\?>+ contains=htmlCommentNested,@htmlPreProc,@Spell keepend 208 " Idem 8.2.4.49: nested comment is parser error, except <!--> is all right 209 syn match htmlCommentNested contained "<!-->\@!" 210 syn match htmlCommentError contained "[^><!]" 211 endif 212 syn region htmlComment start=+<!DOCTYPE+ end=+>+ keepend 213 214 " server-parsed commands 215 syn region htmlPreProc start=+<!--#+ end=+-->+ contains=htmlPreStmt,htmlPreError,htmlPreAttr 216 syn match htmlPreStmt contained "<!--#\%(config\|echo\|exec\|fsize\|flastmod\|include\|printenv\|set\|if\|elif\|else\|endif\|geoguide\)\>" 217 syn match htmlPreError contained "<!--#\S*"ms=s+4 218 syn match htmlPreAttr contained "\w\+=[^"]\S\+" contains=htmlPreProcAttrError,htmlPreProcAttrName 219 syn region htmlPreAttr contained start=+\w\+="+ skip=+\\\\\|\\"+ end=+"+ contains=htmlPreProcAttrName keepend 220 syn match htmlPreProcAttrError contained "\w\+="he=e-1 221 syn match htmlPreProcAttrName contained "\%(expr\|errmsg\|sizefmt\|timefmt\|var\|cgi\|cmd\|file\|virtual\|value\)="he=e-1 222 223 if !exists("html_no_rendering") 224 " rendering 225 syn cluster htmlTop contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,javaScript,@htmlPreproc 226 227 syn region htmlStrike start="<del\>" end="</del\_s*>"me=s-1 contains=@htmlTop 228 syn region htmlStrike start="<s\>" end="</s\_s*>"me=s-1 contains=@htmlTop 229 syn region htmlStrike start="<strike\>" end="</strike\_s*>"me=s-1 contains=@htmlTop 230 231 syn region htmlBold start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic 232 syn region htmlBold start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic 233 syn region htmlBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderlineItalic 234 syn region htmlBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlBoldItalicUnderline 235 syn region htmlBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop,htmlBoldItalicUnderline 236 syn region htmlBoldUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop 237 syn region htmlBoldUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop 238 syn region htmlBoldItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderlineItalic 239 240 syn region htmlUnderline start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBold,htmlUnderlineItalic 241 syn region htmlUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBoldItalic 242 syn region htmlUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBoldItalic 243 syn region htmlUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineItalicBold 244 syn region htmlUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineItalicBold 245 syn region htmlUnderlineItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop 246 syn region htmlUnderlineItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop 247 syn region htmlUnderlineBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop 248 syn region htmlUnderlineBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop 249 250 syn region htmlItalic start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlItalicBold,htmlItalicUnderline 251 syn region htmlItalic start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop 252 syn region htmlItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlItalicBoldUnderline 253 syn region htmlItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlItalicBoldUnderline 254 syn region htmlItalicBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop 255 syn region htmlItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlItalicUnderlineBold 256 syn region htmlItalicUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop 257 syn region htmlItalicUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop 258 259 syn match htmlLeadingSpace "^\s\+" contained 260 syn region htmlLink start="<a\>\_[^>]*\<href\>" end="</a\_s*>"me=s-1 contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLeadingSpace,javaScript,@htmlPreproc 261 syn region htmlH1 start="<h1\>" end="</h1\_s*>"me=s-1 contains=@htmlTop 262 syn region htmlH2 start="<h2\>" end="</h2\_s*>"me=s-1 contains=@htmlTop 263 syn region htmlH3 start="<h3\>" end="</h3\_s*>"me=s-1 contains=@htmlTop 264 syn region htmlH4 start="<h4\>" end="</h4\_s*>"me=s-1 contains=@htmlTop 265 syn region htmlH5 start="<h5\>" end="</h5\_s*>"me=s-1 contains=@htmlTop 266 syn region htmlH6 start="<h6\>" end="</h6\_s*>"me=s-1 contains=@htmlTop 267 syn region htmlHead start="<head\>" end="</head\_s*>"me=s-1 end="<body\>"me=s-1 end="<h[1-6]\>"me=s-1 contains=htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,htmlTitle,javaScript,cssStyle,@htmlPreproc 268 syn region htmlTitle start="<title\>" end="</title\_s*>"me=s-1 contains=htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc 269 endif 270 271 syn keyword htmlTagName contained noscript 272 syn keyword htmlSpecialTagName contained script style 273 if main_syntax != 'java' || exists("java_javascript") 274 " JAVA SCRIPT 275 syn include @htmlJavaScript syntax/javascript.vim 276 unlet b:current_syntax 277 syn region javaScript start=+<script\>\_[^>]*>+ keepend end=+</script\_[^>]*>+me=s-1 contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc 278 syn region htmlScriptTag contained start=+<script+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent 279 hi def link htmlScriptTag htmlTag 280 281 " html events (i.e. arguments that include javascript commands) 282 if exists("html_extended_events") 283 syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ contains=htmlEventSQ 284 syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ contains=htmlEventDQ 285 else 286 syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ keepend contains=htmlEventSQ 287 syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ keepend contains=htmlEventDQ 288 endif 289 syn region htmlEventSQ contained start=+'+ms=s+1 end=+'+me=s-1 contains=@htmlJavaScript 290 syn region htmlEventDQ contained start=+"+ms=s+1 end=+"+me=s-1 contains=@htmlJavaScript 291 hi def link htmlEventSQ htmlEvent 292 hi def link htmlEventDQ htmlEvent 293 294 " a javascript expression is used as an arg value 295 syn region javaScriptExpression contained start=+&{+ keepend end=+};+ contains=@htmlJavaScript,@htmlPreproc 296 endif 297 298 if main_syntax != 'java' || exists("java_vb") 299 " VB SCRIPT 300 syn include @htmlVbScript syntax/vb.vim 301 unlet b:current_syntax 302 syn region javaScript start=+<script \_[^>]*language *=\_[^>]*vbscript\_[^>]*>+ keepend end=+</script\_[^>]*>+me=s-1 contains=@htmlVbScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc 303 endif 304 305 syn cluster htmlJavaScript add=@htmlPreproc 306 307 if main_syntax != 'java' || exists("java_css") 308 " embedded style sheets 309 syn keyword htmlArg contained media 310 syn include @htmlCss syntax/css.vim 311 unlet b:current_syntax 312 syn region cssStyle start=+<style+ keepend end=+</style>+ contains=@htmlCss,htmlTag,htmlEndTag,htmlCssStyleComment,@htmlPreproc 313 syn match htmlCssStyleComment contained "\%(<!--\|-->\)" 314 syn region htmlCssDefinition matchgroup=htmlArg start='style="' keepend matchgroup=htmlString end='"' contains=css.*Attr,css.*Prop,cssComment,cssLength,cssColor,cssURL,cssImportant,cssError,cssString,@htmlPreproc 315 hi def link htmlStyleArg htmlString 316 endif 317 318 if main_syntax == "html" 319 " synchronizing (does not always work if a comment includes legal 320 " html tags, but doing it right would mean to always start 321 " at the first line, which is too slow) 322 syn sync match htmlHighlight groupthere NONE "<[/a-zA-Z]" 323 syn sync match htmlHighlight groupthere javaScript "<script" 324 syn sync match htmlHighlightSkip "^.*['\"].*$" 325 exe "syn sync minlines=" . get(g:, 'html_minlines', 250) 326 endif 327 328 " Folding 329 " (Originally written by Ingo Karkat and Marcus Zanona; see 330 " https://vi.stackexchange.com/questions/2306/html-syntax-folding-in-vim .) 331 if get(g:, "html_syntax_folding", 0) 332 syn region htmlFold start="<\z(\<\%(area\|base\|br\|col\|command\|embed\|hr\|img\|input\|keygen\|link\|meta\|param\|source\|track\|wbr\>\)\@![a-z-]\+\>\)\%(\_s*\_[^/]\?>\|\_s\_[^>]*\_[^>/]>\)" end="</\z1\_s*>" fold transparent keepend extend containedin=htmlHead,htmlH\d 333 " fold comments (the real ones and the old Netscape ones) 334 if exists("html_wrong_comments") 335 syn region htmlComment start=+<!--+ end=+--\s*>\%(\n\s*<!--\)\@!+ contains=@Spell fold 336 endif 337 endif 338 339 " The default highlighting. 340 hi def link htmlTag Function 341 hi def link htmlEndTag Identifier 342 hi def link htmlArg Type 343 hi def link htmlTagName htmlStatement 344 hi def link htmlSpecialTagName Exception 345 hi def link htmlMathTagName htmlTagName 346 hi def link htmlSvgTagName htmlTagName 347 hi def link htmlValue String 348 hi def link htmlSpecialChar Special 349 350 if !exists("html_no_rendering") 351 hi def link htmlH1 Title 352 hi def link htmlH2 htmlH1 353 hi def link htmlH3 htmlH2 354 hi def link htmlH4 htmlH3 355 hi def link htmlH5 htmlH4 356 hi def link htmlH6 htmlH5 357 hi def link htmlHead PreProc 358 hi def link htmlTitle Title 359 hi def link htmlBoldItalicUnderline htmlBoldUnderlineItalic 360 hi def link htmlUnderlineBold htmlBoldUnderline 361 hi def link htmlUnderlineItalicBold htmlBoldUnderlineItalic 362 hi def link htmlUnderlineBoldItalic htmlBoldUnderlineItalic 363 hi def link htmlItalicUnderline htmlUnderlineItalic 364 hi def link htmlItalicBold htmlBoldItalic 365 hi def link htmlItalicBoldUnderline htmlBoldUnderlineItalic 366 hi def link htmlItalicUnderlineBold htmlBoldUnderlineItalic 367 hi def link htmlLink Underlined 368 hi def link htmlLeadingSpace None 369 if !exists("html_my_rendering") 370 hi def htmlBold term=bold cterm=bold gui=bold 371 hi def htmlBoldUnderline term=bold,underline cterm=bold,underline gui=bold,underline 372 hi def htmlBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic 373 hi def htmlBoldUnderlineItalic term=bold,italic,underline cterm=bold,italic,underline gui=bold,italic,underline 374 hi def htmlUnderline term=underline cterm=underline gui=underline 375 hi def htmlUnderlineItalic term=italic,underline cterm=italic,underline gui=italic,underline 376 hi def htmlItalic term=italic cterm=italic gui=italic 377 if v:version > 800 || v:version == 800 && has("patch1038") 378 hi def htmlStrike term=strikethrough cterm=strikethrough gui=strikethrough 379 else 380 hi def htmlStrike term=underline cterm=underline gui=underline 381 endif 382 endif 383 endif 384 385 hi def link htmlPreStmt PreProc 386 hi def link htmlPreError Error 387 hi def link htmlPreProc PreProc 388 hi def link htmlPreAttr String 389 hi def link htmlPreProcAttrName PreProc 390 hi def link htmlPreProcAttrError Error 391 hi def link htmlString String 392 hi def link htmlStatement Statement 393 hi def link htmlComment Comment 394 hi def link htmlCommentNested htmlError 395 hi def link htmlCommentError htmlError 396 hi def link htmlTagError htmlError 397 hi def link htmlEvent javaScript 398 hi def link htmlError Error 399 400 hi def link javaScript Special 401 hi def link javaScriptExpression javaScript 402 hi def link htmlCssStyleComment Comment 403 hi def link htmlCssDefinition Special 404 405 let b:current_syntax = "html" 406 407 if main_syntax == 'html' 408 unlet main_syntax 409 endif 410 411 let &cpo = s:cpo_save 412 unlet s:cpo_save 413 414 " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: