" Vim syntax file " Maintainer: Maxim Kim " Language: Typst " Last Change: 2026 Jun 30 " Based on the syntax file from https://github.com/kaarmu/typst.vim if exists('b:current_syntax') finish endif let s:cpo_save = &cpo set cpo&vim syntax spell toplevel syntax sync minlines=300 syntax iskeyword @,48-57,192-255,_,- syntax cluster typstExpr \ contains=typstExprCodeBlock \ ,typstExprFunc \ ,typstExprContentBlock \ ,typstExprBraces \ ,typstExprColon \ ,typstExprDot \ ,typstExprCommand \ ,@typstExprConstants \ ,typstExprVar \ ,typstExprOpSym \ ,typstExprOp \ ,@typstComment syntax match typstExprStart /#/ nextgroup=@typstExpr,typstExprBareVar syntax match typstExprDot /\./ \ contained \ nextgroup=@typstExpr syntax match typstExprColon /:/ \ skipwhite \ contained \ nextgroup=@typstExpr syntax match typstExprVar /\k\+/ \ skipwhite \ contained \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr syntax region typstExprBraces \ skipwhite \ contained \ contains=@typstExpr,typstMarkupMath \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr \ start=/(/ \ end=/)/ syntax match typstExprOpSym /\%(=[=>]\)\|\%([-+*/<>!=]=\)\|[<=>\-+*/]/ \ skipwhite \ contained \ nextgroup=typstExprFunc,@typstExpr syntax match typstExprOp /in\>\|and\>\|or\>\|\%(not\%(\s\+in\>\)\?\)/ \ skipwhite skipempty \ contained \ nextgroup=@typstExpr syntax match typstExprBareVar /\k\+/ skipwhite contained syntax match typstExprCommand \ /let\|set\|while\|for\|if\|else\|show\|import\|include\|context\|return/ \ skipwhite skipempty \ contained \ nextgroup=@typstExpr syntax region typstExprCodeBlock \ skipwhite \ contained \ contains=@typstExpr \ start=/{/ \ end=/}/ syntax region typstExprContentBlock \ skipwhite \ contained \ extend \ contains=@typstMarkup,typstExprStart,typstMarkupMath \ nextgroup=@typstExpr \ matchgroup=NONE \ start=/\[/ \ end=/\]/ syntax match typstExprFunc \ skipwhite \ contained \ contains=typstExprDot \ nextgroup=typstExprBraces,typstExprContentBlock,@typstExpr \ /\k\+\%(\.\k\+\)*[[(]\@=/ syntax cluster typstExprConstants \ contains=typstExprConstant \ ,typstExprNumber \ ,typstExprString \ ,typstExprLabel syntax match typstExprConstant \ contained \ /\v<%(none|auto|true|false)-@!>/ syntax region typstExprString \ contained \ start=/"/ skip=/\v\\\\|\\"/ end=/"/ \ contains=@Spell syntax match typstExprNumber \ skipwhite \ contained \ nextgroup=typstExprNumberType,typstExprOp,typstExprOpSym,@typstExpr \ /\v<\d+%(\.\d+)?/ syntax match typstExprNumberType \ contained \ nextgroup=typstExprOp,typstExprOpSym,@typstExpr \ /\v%(pt|mm|cm|in|em|deg|rad|\%|fr)>?/ syntax match typstExprLabel \ contained \ /\v\<\K%(\k*-*)*\>/ syntax region typstMarkupDollar \ matchgroup=typstMarkupDollar start=/\\\@1/ end=/```/' \ ,'contains=@typstEmbedded_'..s:name \ ,'keepend' \ ,'concealends'] execute 'silent! ' .. join(s:include, ' ') unlet! b:current_syntax execute join(s:rule, ' ') endfor " Label & Reference syntax match typstMarkupLabel \ /\v\<\K%(\k*-*)*\>/ syntax match typstMarkupReference \ /\v\@\K%(\k*-*)*/ syntax match typstMarkupUrl \ #\v\w+://\S*# syntax region typstMarkupHeading \ matchgroup=typstMarkupHeadingDelimiter \ start=/^\s*\zs=\{1,6}\s/ \ end=/$/ keepend oneline \ contains=typstMarkupLabel,@Spell syntax match typstMarkupBulletList \ /\v^\s*-\s+/ syntax match typstMarkupEnumList \ /\v^\s*(\+|\d+\.)\s+/ syntax region typstMarkupTermList \ matchgroup=typstMarkupTermListDelimiter \ start=/\v^\s*\/\s/ \ skip=/\\:/ \ end=/:/ \ oneline contains=@typstMarkup syn region typstMarkupBold \ start=+\%(^\|[\[[:space:]-:/]\)\@1<=\*[^*]\@1=+ \ skip=+\\\*+ \ end=+\*\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ \ concealends contains=typstMarkupLabel,@Spell syn region typstMarkupItalic \ start=+\%(^\|[\[[:space:]-:/]\)\@1<=_[^_]\@1=+ \ skip=+\\_+ \ end=+_\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ \ concealends contains=typstMarkupLabel,@Spell syn region typstMarkupBoldItalic \ start=+\%(^\|[\[[:space:]-:/]\)\@1<=\*_[^*_]\@1=+ \ skip=+\\\*_+ \ end=+_\*\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ \ concealends contains=typstMarkupLabel,@Spell syn region typstMarkupBoldItalic \ start=+\%(^\|[[:space:]-:/]\)\@1<=_\*[^*_]\@1=+ \ skip=+\\_\*+ \ end=+\*_\($\|[[:space:]-.,:;!?"'/\\>)\]}]\)\@1=+ \ concealends contains=typstMarkupLabel,@Spell syntax match typstMarkupBackslash /\\\\/ syntax match typstMarkupLinebreak /\\\%(\s\|$\)/ syntax match typstMarkupNonbreakingSpace /\~/ syntax match typstMarkupShy /-?/ syntax match typstMarkupDash /-\{2,3}/ syntax match typstMarkupEllipsis /\.\.\./ syntax match typstMarkupEscape /\\./ syntax region typstMarkupMath \ matchgroup=typstMarkupDollar start=/\\\@1