neovim

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

pkl.vim (7039B)


      1 " Vim syntax file
      2 " Language:		PKL
      3 " Maintainer:		Jan Claußen <jan DOT claussen10 AT web DOT de>
      4 " Last Change:		2025 Sep 24
      5 
      6 if exists("b:current_syntax")
      7  finish
      8 endif
      9 
     10 " We use line-continuation here
     11 let s:cpo_save = &cpo
     12 set cpo&vim
     13 
     14 " Needed to properly highlight multiline strings
     15 syn sync fromstart
     16 
     17 " PKL supports non-Unicode identifiers. So we modify the keyword character
     18 " class to include them
     19 syn iskeyword @,48-57,192-255,$,_
     20 
     21 " Declare a variable for identifiers
     22 let s:id  = '\%(\K\+\d*[_$]*\K*\d*[_$]*\)'
     23 
     24 " --- Decorator ---
     25 exe $'syn match	pklDecorator     "@{s:id}\{{1,}}"'
     26 
     27 " --- Comments ---
     28 syn match	pklComment	"\/\{2}.*"
     29 syn match	pklDocComment	"\/\{3}.*"
     30 syn region	pklMultiComment	start="\/\*" end="\*\/" keepend fold
     31 
     32 " --- Strings ---
     33 syn region	pklString	start=+"+ end=+"+ contains=pklEscape,pklUnicodeEscape,pklStringInterpolation oneline
     34 syn region	pklMultiString	start=+"""+ skip=+\\."+ end=+"""+ contains=pklEscape,pklUnicodeEscape keepend fold
     35 syn match	pklEscape	"\\[\\nt0rbaeuf"']" contained containedin=pklString,pklMultiString
     36 syn match	pklUnicode	"[0-9A-Fa-f]\+" contained
     37 
     38 " --- String interpolation ---
     39 " Standard interpolation
     40 syn region	pklStringInterpolation matchgroup=pklDelimiter
     41   \ start=+\\(+ end=+)+ contains=pklNumbers,pklOperator,pklIdentifier,pklFunction,pklParen,pklString
     42   \ contained containedin=pklString,pklMultiString oneline
     43 " Unicode escape sequences
     44 syn region	pklUnicodeEscape matchgroup=pklDelimiter
     45   \ start=+\\u{+ end=+}+ contains=pklUnicode
     46   \ contained containedin=pklString,pklMultiString
     47 
     48 " --- Basic data types ---
     49 syn keyword	pklType
     50   \ UInt UInt8 UInt16 UInt32 UInt64 UInt128
     51   \ Int Int8 Int16 Int32 Int64 Int128
     52   \ Float
     53   \ Number
     54   \ String
     55   \ Boolean
     56   \ Null
     57   \ Any
     58 
     59 syn keyword	pklCollections
     60   \ Map Mapping
     61   \ List Listing
     62   \ Set
     63 
     64 " --- Custom string delimiters ---
     65 function! s:DefineCustomStringDelimiters(n)
     66  for x in range(1, a:n)
     67    exe $'syn region pklString{x}Pound start=+{repeat("#", x)}"+ end=+"{repeat("#", x)}+ contains=pklStringInterpolation{x}Pound,pklEscape{x}Pound oneline'
     68    exe $'hi def link pklString{x}Pound String'
     69 
     70    exe $'syn region pklMultiString{x}Pound start=+{repeat("#", x)}"""+ end=+"""{repeat("#", x)}+ contains=pklStringInterpolation{x}Pound,pklEscape{x}Pound keepend fold'
     71    exe $'hi def link pklMultiString{x}Pound String'
     72 
     73    exe $'syn match pklEscape{x}Pound "\\{repeat("#", x) }[\\nt0rbaeuf"'']" contained containedin=pklString{x}Pound,pklMultiString{x}Pound'
     74    exe $'hi def link pklEscape{x}Pound SpecialChar'
     75 
     76    exe $'syn region pklStringInterpolation{x}Pound matchgroup=pklDelimiter start=+\\{repeat("#", x)}(+ end=+)+ contains=pklNumbers,pklOperator,pklIdentifier,pklFunction,pklParen,pklString contained containedin=pklString{x}Pound,pklMultiString{x}Pound oneline'
     77 
     78    exe $'syn region pklUnicodeEscape{x}Pound matchgroup=pklDelimiter start=+\\{repeat("#", x)}u{{+ end=+}}+ contains=pklUnicode contained containedin=pklString{x}Pound,pklMultiString{x}Pound'
     79    exe $'hi def link pklUnicodeEscape{x}Pound SpecialChar'
     80  endfor
     81 endfunction
     82 
     83 call s:DefineCustomStringDelimiters(5)
     84 
     85 " --- Keywords ---
     86 syn keyword	pklBoolean       false true
     87 syn keyword	pklClass         outer super this module new
     88 syn keyword	pklConditional   if else when
     89 syn keyword	pklConstant      null NaN Infinity
     90 syn keyword	pklException     throw
     91 syn keyword	pklInclude       amends import extends as
     92 syn keyword	pklKeyword       function let out is
     93 syn keyword	pklModifier      abstract const external fixed hidden local open
     94 syn keyword	pklReserved      case delete override protected record switch vararg
     95 syn keyword	pklRepeat        for in
     96 syn keyword	pklSpecial       nothing unknown
     97 syn keyword	pklStatement     trace read
     98 syn keyword	pklStruct        typealias class
     99 
    100 " Include all unicode letters
    101 exe $'syn match pklIdentifier "{s:id}"'
    102 
    103 " Explicitely make keywords identifiers with backticks
    104 syn region	pklIdentifierExplicit	start=+`+ end=+`+
    105 
    106 syn match	pklOperator      ",\||\|+\|*\|->\|?\|-\|==\|=\|!=\|!" contained containedin=pklType
    107 
    108 " --- Numbers ---
    109 " decimal numbers
    110 syn match	pklNumbers	display transparent "\<\d\|\.\d" contains=pklNumber,pklFloat,pklOctal
    111 syn match	pklNumber	display contained "\d\%(\d\+\)*\>"
    112 " hex numbers
    113 syn match	pklNumber	display contained "0x\x\%('\=\x\+\)\>"
    114 " binary numbers
    115 syn match	pklNumber	display contained "0b[01]\%('\=[01]\+\)\>"
    116 " octal numbers
    117 syn match	pklOctal	display contained "0o\o\+\>"
    118 
    119 "floating point number, with dot, optional exponent
    120 syn match	pklFloat	display contained "\d\+\.\d\+\%(e[-+]\=\d\+\)\="
    121 "floating point number, starting with a dot, optional exponent
    122 syn match	pklFloat	display contained "\.\d\+\%(e[-+]\=\d\+\)\=\>"
    123 "floating point number, without dot, with exponent
    124 syn match	pklFloat	display contained "\d\+e[-+]\=\d\+\>"
    125 
    126 " --- Brackets, operators, functions ---
    127 syn region	pklParen	matchgroup=pklBrackets start='(' end=')' contains=ALLBUT,pklUnicode transparent
    128 syn region	pklBracket	matchgroup=pklBrackets start='\[\|<::\@!' end=']\|:>' contains=ALLBUT,pklUnicode transparent
    129 syn region	pklBlock	matchgroup=pklBrackets start="{" end="}" contains=ALLBUT,pklUnicode fold transparent
    130 
    131 exe $'syn match	pklFunction	"\<\h{s:id}*\>\ze\_s*[?|\*]\?(" contains=pklType'
    132 
    133 " --- Highlight links ---
    134 hi def link	pklBoolean                       Boolean
    135 hi def link	pklBrackets                      Delimiter
    136 hi def link	pklClass                         Statement
    137 hi def link	pklCollections                   Type
    138 hi def link	pklComment                       Comment
    139 hi def link	pklConditional                   Conditional
    140 hi def link	pklConstant                      Constant
    141 hi def link	pklDecorator                     Special
    142 hi def link	pklDelimiter                     Delimiter
    143 hi def link	pklDocComment                    Comment
    144 hi def link	pklEscape                        SpecialChar
    145 hi def link	pklException                     Exception
    146 hi def link	pklFloat                         Number
    147 hi def link	pklFunction                      Function
    148 hi def link	pklInclude                       Include
    149 hi def link	pklKeyword                       Keyword
    150 hi def link	pklModifier                      StorageClass
    151 hi def link	pklMultiComment                  Comment
    152 hi def link	pklMultiString                   String
    153 hi def link	pklNumber                        Number
    154 hi def link	pklNumbers                       Number
    155 hi def link	pklOctal                         Number
    156 hi def link	pklRepeat                        Repeat
    157 hi def link	pklReserved                      Error
    158 hi def link	pklShebang                       Comment
    159 hi def link	pklSpecial                       Special
    160 hi def link	pklStatement                     Statement
    161 hi def link	pklString                        String
    162 hi def link	pklStruct                        Structure
    163 hi def link	pklType                          Type
    164 hi def link	pklUnicodeEscape                 SpecialChar
    165 
    166 let b:current_syntax = "pkl"
    167 
    168 let &cpo = s:cpo_save
    169 unlet s:cpo_save