typst.vim (16033B)
1 " Vim syntax file 2 " Previous Maintainer: Luca Saccarola <github.e41mv@aleeas.com> 3 " Maintainer: This runtime file is looking for a new maintainer. 4 " Language: Typst 5 " Based On: https://github.com/kaarmu/typst.vim 6 " Last Change: 2025 Aug 05 7 8 if exists('b:current_syntax') 9 finish 10 endif 11 12 let s:cpo_save = &cpo 13 set cpo&vim 14 15 syntax sync fromstart 16 syntax spell toplevel 17 18 " Common {{{1 19 syntax cluster typstCommon 20 \ contains=@typstComment 21 22 " Common > Comment {{{2 23 syntax cluster typstComment 24 \ contains=typstCommentBlock,typstCommentLine 25 syntax region typstCommentBlock 26 \ start="/\*" end="\*/" keepend 27 \ contains=typstCommentTodo,@Spell 28 syntax match typstCommentLine 29 \ #//.*# 30 \ contains=typstCommentTodo,@Spell 31 syntax keyword typstCommentTodo 32 \ contained 33 \ TODO FIXME XXX TBD 34 35 36 " Code {{{1 37 syntax cluster typstCode 38 \ contains=@typstCommon 39 \ ,@typstCodeKeywords 40 \ ,@typstCodeConstants 41 \ ,@typstCodeIdentifiers 42 \ ,@typstCodeFunctions 43 \ ,@typstCodeParens 44 45 " Code > Keywords {{{2 46 syntax cluster typstCodeKeywords 47 \ contains=typstCodeConditional 48 \ ,typstCodeRepeat 49 \ ,typstCodeKeyword 50 \ ,typstCodeStatement 51 syntax keyword typstCodeConditional 52 \ contained 53 \ if else 54 syntax keyword typstCodeRepeat 55 \ contained 56 \ while for 57 syntax keyword typstCodeKeyword 58 \ contained 59 \ not in and or return 60 syntax region typstCodeStatement 61 \ contained 62 \ matchgroup=typstCodeStatementWord start=/\v(let|set|import|include)>/ 63 \ matchgroup=Noise end=/\v%(;|$)/ 64 \ contains=@typstCode 65 syntax region typstCodeStatement 66 \ contained 67 \ matchgroup=typstCodeStatementWord start=/show/ 68 \ matchgroup=Noise end=/\v%(:|$)/ keepend 69 \ contains=@typstCode 70 \ skipwhite nextgroup=@typstCode,typstCodeShowRocket 71 syntax match typstCodeShowRocket 72 \ contained 73 \ /.*=>/ 74 \ contains=@typstCode 75 \ skipwhite nextgroup=@typstCode 76 77 " Code > Identifiers {{{2 78 syntax cluster typstCodeIdentifiers 79 \ contains=typstCodeIdentifier 80 \ ,typstCodeFieldAccess 81 syntax match typstCodeIdentifier 82 \ contained 83 \ /\v\w\k*>(<%(let|set|show|import|include))@<![\.\[\(]@!/ 84 syntax match typstCodeFieldAccess 85 \ contained 86 \ /\v\w\k*>(<%(let|set|show|import|include))@<!\.[\[\(]@!/ 87 \ nextgroup=typstCodeFieldAccess,typstCodeFunction 88 89 " Code > Functions {{{2 90 syntax cluster typstCodeFunctions 91 \ contains=typstCodeFunction 92 syntax match typstCodeFunction 93 \ contained 94 \ /\v\w\k*>(<%(let|set|show|import|include))@<![\(\[]@=/ 95 \ nextgroup=typstCodeFunctionArgument 96 syntax match typstCodeFunctionArgument 97 \ contained 98 \ /\v%(%(\(.{-}\)|\[.{-}\]|\{.{-}\}))*/ transparent 99 \ contains=@typstCode 100 101 " Code > Constants {{{2 102 syntax cluster typstCodeConstants 103 \ contains=typstCodeConstant 104 \ ,typstCodeNumberInteger 105 \ ,typstCodeNumberFloat 106 \ ,typstCodeNumberLength 107 \ ,typstCodeNumberAngle 108 \ ,typstCodeNumberRatio 109 \ ,typstCodeNumberFraction 110 \ ,typstCodeString 111 \ ,typstCodeLabel 112 syntax match typstCodeConstant 113 \ contained 114 \ /\v<%(none|auto|true|false)-@!>/ 115 syntax match typstCodeNumberInteger 116 \ contained 117 \ /\v<\d+>/ 118 119 syntax match typstCodeNumberFloat 120 \ contained 121 \ /\v<\d+\.\d*>/ 122 syntax match typstCodeNumberLength 123 \ contained 124 \ /\v<\d+(\.\d*)?(pt|mm|cm|in|em)>/ 125 syntax match typstCodeNumberAngle 126 \ contained 127 \ /\v<\d+(\.\d*)?(deg|rad)>/ 128 syntax match typstCodeNumberRatio 129 \ contained 130 \ /\v<\d+(\.\d*)?\%/ 131 syntax match typstCodeNumberFraction 132 \ contained 133 \ /\v<\d+(\.\d*)?fr>/ 134 syntax region typstCodeString 135 \ contained 136 \ start=/"/ skip=/\v\\\\|\\"/ end=/"/ 137 \ contains=@Spell 138 syntax match typstCodeLabel 139 \ contained 140 \ /\v\<\K%(\k*-*)*\>/ 141 142 " Code > Parens {{{2 143 syntax cluster typstCodeParens 144 \ contains=typstCodeParen 145 \ ,typstCodeBrace 146 \ ,typstCodeBracket 147 \ ,typstCodeDollar 148 \ ,typstMarkupRawInline 149 \ ,typstMarkupRawBlock 150 syntax region typstCodeParen 151 \ contained 152 \ matchgroup=Noise start=/(/ end=/)/ 153 \ contains=@typstCode 154 syntax region typstCodeBrace 155 \ contained 156 \ matchgroup=Noise start=/{/ end=/}/ 157 \ contains=@typstCode 158 syntax region typstCodeBracket 159 \ contained 160 \ matchgroup=Noise start=/\[/ end=/\]/ 161 \ contains=@typstMarkup 162 syntax region typstCodeDollar 163 \ contained 164 \ matchgroup=Number start=/\\\@<!\$/ end=/\\\@<!\$/ 165 \ contains=@typstMath 166 167 168 " Hashtag {{{1 169 syntax cluster typstHashtag 170 \ contains=@typstHashtagKeywords 171 \ ,@typstHashtagConstants 172 \ ,@typstHashtagIdentifiers 173 \ ,@typstHashtagFunctions 174 \ ,@typstHashtagParens 175 176 " Hashtag > Keywords {{{2 177 syntax cluster typstHashtagKeywords 178 \ contains=typstHashtagConditional 179 \ ,typstHashtagRepeat 180 \ ,typstHashtagKeywords 181 \ ,typstHashtagStatement 182 183 " syntax match typstHashtagControlFlowError 184 " \ /\v#%(if|while|for)>-@!.{-}$\_.{-}%(\{|\[|\()/ 185 syntax match typstHashtagControlFlow 186 \ /\v#%(if|while|for)>.{-}\ze%(\{|\[|\()/ 187 \ contains=typstHashtagConditional,typstHashtagRepeat 188 \ nextgroup=@typstCode 189 syntax region typstHashtagConditional 190 \ contained 191 \ start=/\v#if>/ end=/\v\ze(\{|\[)/ 192 \ contains=@typstCode 193 syntax region typstHashtagRepeat 194 \ contained 195 \ start=/\v#(while|for)>/ end=/\v\ze(\{|\[)/ 196 \ contains=@typstCode 197 syntax match typstHashtagKeyword 198 \ /\v#(return)>/ 199 \ skipwhite nextgroup=@typstCode 200 syntax region typstHashtagStatement 201 \ matchgroup=typstHashtagStatementWord start=/\v#(let|set|import|include)>/ 202 \ matchgroup=Noise end=/\v%(;|$)/ 203 \ contains=@typstCode 204 syntax region typstHashtagStatement 205 \ matchgroup=typstHashtagStatementWord start=/#show/ 206 \ matchgroup=Noise end=/\v%(:|$)/ keepend 207 \ contains=@typstCode 208 \ skipwhite nextgroup=@typstCode,typstCodeShowRocket 209 210 " Hashtag > Constants {{{2 211 syntax cluster typstHashtagConstants 212 \ contains=typstHashtagConstant 213 syntax match typstHashtagConstant 214 \ /\v#(none|auto|true|false)>/ 215 216 " Hashtag > Identifiers {{{2 217 syntax cluster typstHashtagIdentifiers 218 \ contains=typstHashtagIdentifier 219 \ ,typstHashtagFieldAccess 220 syntax match typstHashtagIdentifier 221 \ /\v#\w\k*>(<%(let|set|show|import|include))@<![\.\[\(]@!/ 222 syntax match typstHashtagFieldAccess 223 \ /\v#\w\k*>(<%(let|set|show|import|include))@<!\.[\[\(]@!/ 224 \ nextgroup=typstCodeFieldAccess,typstCodeFunction 225 226 " Hashtag > Functions {{{2 227 syntax cluster typstHashtagFunctions 228 \ contains=typstHashtagFunction 229 syntax match typstHashtagFunction 230 \ /\v#\w\k*>(<%(let|set|show|import|include))@<![\(\[]@=/ 231 \ nextgroup=typstCodeFunctionArgument 232 233 " Hashtag > Parens {{{2 234 syntax cluster typstHashtagParens 235 \ contains=typstHashtagParen 236 \ ,typstHashtagBrace 237 \ ,typstHashtagBracket 238 \ ,typstHashtagDollar 239 syntax region typstHashtagParen 240 \ matchgroup=Noise start=/#(/ end=/)/ 241 \ contains=@typstCode 242 syntax region typstHashtagBrace 243 \ matchgroup=Noise start=/#{/ end=/}/ 244 \ contains=@typstCode 245 syntax region typstHashtagBracket 246 \ matchgroup=Noise start=/#\[/ end=/\]/ 247 \ contains=@typstMarkup 248 syntax region typstHashtagDollar 249 \ matchgroup=Noise start=/#\$/ end=/\\\@<!\$/ 250 \ contains=@typstMath 251 252 253 " Markup {{{1 254 syntax cluster typstMarkup 255 \ contains=@typstCommon 256 \ ,@Spell 257 \ ,@typstHashtag 258 \ ,@typstMarkupText 259 \ ,@typstMarkupParens 260 261 " Markup > Text {{{2 262 syntax cluster typstMarkupText 263 \ contains=typstMarkupRawInline 264 \ ,typstMarkupRawBlock 265 \ ,typstMarkupLabel 266 \ ,typstMarkupReference 267 \ ,typstMarkupUrl 268 \ ,typstMarkupHeading 269 \ ,typstMarkupBulletList 270 \ ,typstMarkupEnumList 271 \ ,typstMarkupTermList 272 \ ,typstMarkupBold 273 \ ,typstMarkupItalic 274 \ ,typstMarkupLinebreak 275 \ ,typstMarkupNonbreakingSpace 276 \ ,typstMarkupShy 277 \ ,typstMarkupDash 278 \ ,typstMarkupEllipsis 279 280 " Raw Text 281 syntax match typstMarkupRawInline 282 \ /`.\{-}`/ 283 syntax region typstMarkupRawBlock 284 \ matchgroup=Macro start=/```\w*/ 285 \ matchgroup=Macro end=/```/ keepend 286 syntax region typstMarkupCodeBlockTypst 287 \ matchgroup=Macro start=/```typst/ 288 \ matchgroup=Macro end=/```/ contains=@typstCode keepend 289 \ concealends 290 291 for s:name in get(g:, 'typst_embedded_languages', []) 292 let s:include = ['syntax include' 293 \ ,'@typstEmbedded_'..s:name 294 \ ,'syntax/'..s:name..'.vim'] 295 let s:rule = ['syn region' 296 \,s:name 297 \,'matchgroup=Macro' 298 \,'start=/```'..s:name..'\>/ end=/```/' 299 \,'contains=@typstEmbedded_'..s:name 300 \,'keepend' 301 \,'concealends'] 302 execute 'silent! ' .. join(s:include, ' ') 303 unlet! b:current_syntax 304 execute join(s:rule, ' ') 305 endfor 306 307 " Label & Reference 308 syntax match typstMarkupLabel 309 \ /\v\<\K%(\k*-*)*\>/ 310 syntax match typstMarkupReference 311 \ /\v\@\K%(\k*-*)*/ 312 313 " URL 314 syntax match typstMarkupUrl 315 \ #\v\w+://\S*# 316 317 " Heading 318 syntax match typstMarkupHeading 319 \ /^\s*\zs=\{1,6}\s.*$/ 320 \ contains=typstMarkupLabel,@Spell 321 322 " Lists 323 syntax match typstMarkupBulletList 324 \ /\v^\s*-\s+/ 325 syntax match typstMarkupEnumList 326 \ /\v^\s*(\+|\d+\.)\s+/ 327 syntax region typstMarkupTermList 328 \ oneline start=/\v^\s*\/\s/ end=/:/ 329 \ contains=@typstMarkup 330 331 " Bold & Italic 332 syntax match typstMarkupBold 333 \ /\v(\w|\\)@1<!\*\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!\*/ 334 \ contains=typstMarkupBoldRegion 335 syntax match typstMarkupItalic 336 \ /\v(\w|\\)@1<!_\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!_/ 337 \ contains=typstMarkupItalicRegion 338 syntax match typstMarkupBoldItalic 339 \ contained 340 \ /\v(\w|\\)@1<![_\*]\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!\2/ 341 \ contains=typstMarkupBoldRegion,typstMarkupItalicRegion 342 syntax region typstMarkupBoldRegion 343 \ contained 344 \ transparent matchgroup=typstMarkupBold 345 \ start=/\(^\|[^0-9a-zA-Z]\)\@<=\*/ end=/\*\($\|[^0-9a-zA-Z]\)\@=/ 346 \ concealends contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell 347 syntax region typstMarkupItalicRegion 348 \ contained 349 \ transparent matchgroup=typstMarkupItalic 350 \ start=/\(^\|[^0-9a-zA-Z]\)\@<=_/ end=/_\($\|[^0-9a-zA-Z]\)\@=/ 351 \ concealends contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell 352 353 " Linebreak & Special Whitespace 354 syntax match typstMarkupLinebreak 355 \ /\\\\/ 356 syntax match typstMarkupNonbreakingSpace 357 \ /\~/ 358 syntax match typstMarkupShy 359 \ /-?/ 360 361 " Special Symbols 362 syntax match typstMarkupDash 363 \ /-\{2,3}/ 364 syntax match typstMarkupEllipsis 365 \ /\.\.\./ 366 367 " Markup > Parens {{{2 368 syntax cluster typstMarkupParens 369 \ contains=typstMarkupBracket 370 \ ,typstMarkupDollar 371 syntax region typstMarkupBracket 372 \ matchgroup=Noise start=/\[/ end=/\]/ 373 \ contains=@typstMarkup 374 syntax region typstMarkupDollar 375 \ matchgroup=Special start=/\\\@<!\$/ end=/\\\@<!\$/ 376 \ contains=@typstMath 377 378 379 " Math {{{1 380 syntax cluster typstMath 381 \ contains=@typstCommon 382 \ ,@typstHashtag 383 \ ,typstMathIdentifier 384 \ ,typstMathFunction 385 \ ,typstMathNumber 386 \ ,typstMathSymbol 387 \ ,typstMathBold 388 \ ,typstMathScripts 389 \ ,typstMathQuote 390 391 syntax match typstMathIdentifier 392 \ /\a\a\+/ 393 \ contained 394 syntax match typstMathFunction 395 \ /\a\a\+\ze(/ 396 \ contained 397 syntax match typstMathNumber 398 \ /\<\d\+\>/ 399 \ contained 400 syntax region typstMathQuote 401 \ matchgroup=String start=/"/ skip=/\\"/ end=/"/ 402 \ contained 403 404 " Math > Linked groups {{{2 405 highlight default link typstMathIdentifier Identifier 406 highlight default link typstMathFunction Statement 407 highlight default link typstMathNumber Number 408 highlight default link typstMathSymbol Statement 409 410 " Highlighting {{{1 411 412 " Highlighting > Linked groups {{{2 413 highlight default link typstCommentBlock Comment 414 highlight default link typstCommentLine Comment 415 highlight default link typstCommentTodo Todo 416 highlight default link typstCodeConditional Conditional 417 highlight default link typstCodeRepeat Repeat 418 highlight default link typstCodeKeyword Keyword 419 highlight default link typstCodeConstant Constant 420 highlight default link typstCodeNumberInteger Number 421 highlight default link typstCodeNumberFloat Number 422 highlight default link typstCodeNumberLength Number 423 highlight default link typstCodeNumberAngle Number 424 highlight default link typstCodeNumberRatio Number 425 highlight default link typstCodeNumberFraction Number 426 highlight default link typstCodeString String 427 highlight default link typstCodeLabel Structure 428 highlight default link typstCodeStatementWord Statement 429 highlight default link typstCodeIdentifier Identifier 430 highlight default link typstCodeFieldAccess Identifier 431 highlight default link typstCodeFunction Function 432 highlight default link typstCodeParen Noise 433 highlight default link typstCodeBrace Noise 434 highlight default link typstCodeBracket Noise 435 highlight default link typstCodeDollar Noise 436 " highlight default link typstHashtagControlFlowError Error 437 highlight default link typstHashtagConditional Conditional 438 highlight default link typstHashtagRepeat Repeat 439 highlight default link typstHashtagKeyword Keyword 440 highlight default link typstHashtagConstant Constant 441 highlight default link typstHashtagStatementWord Statement 442 highlight default link typstHashtagIdentifier Identifier 443 highlight default link typstHashtagFieldAccess Identifier 444 highlight default link typstHashtagFunction Function 445 highlight default link typstHashtagParen Noise 446 highlight default link typstHashtagBrace Noise 447 highlight default link typstHashtagBracket Noise 448 highlight default link typstHashtagDollar Noise 449 highlight default link typstMarkupRawInline Macro 450 highlight default link typstMarkupRawBlock Macro 451 highlight default link typstMarkupLabel Structure 452 highlight default link typstMarkupReference Structure 453 highlight default link typstMarkupBulletList Structure 454 " highlight default link typstMarkupItalicError Error 455 " highlight default link typstMarkupBoldError Error 456 highlight default link typstMarkupEnumList Structure 457 highlight default link typstMarkupLinebreak Structure 458 highlight default link typstMarkupNonbreakingSpace Structure 459 highlight default link typstMarkupShy Structure 460 highlight default link typstMarkupDash Structure 461 highlight default link typstMarkupEllipsis Structure 462 highlight default link typstMarkupTermList Structure 463 highlight default link typstMarkupDollar Noise 464 465 " Highlighting > Custom Styling {{{2 466 highlight! Conceal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE 467 468 highlight default typstMarkupHeading term=underline,bold cterm=underline,bold gui=underline,bold 469 highlight default typstMarkupUrl term=underline cterm=underline gui=underline 470 highlight default typstMarkupBold term=bold cterm=bold gui=bold 471 highlight default typstMarkupItalic term=italic cterm=italic gui=italic 472 highlight default typstMarkupBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic 473 474 let b:current_syntax = 'typst' 475 476 let &cpo = s:cpo_save 477 unlet s:cpo_save 478 479 " }}}1