neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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