" Vim syntax file
" Language: Bruijn

if exists("b:current_syntax")
  finish
endif

syn match bruijnApplication /[()]/
syn match bruijnAbstraction /[[\]]/
syn match bruijnIndex /\([^0-9A-Za-z]\)\@<=\d\([^0-9]\)\@=/
syn match bruijnChar /'\@<=.'\@=/
syn match bruijnNumber /([+-]\d\+[dubt]\?)/
syn match bruijnFloat /([+-]\d\+\.\d\+[qr]\?)/
syn match bruijnComplex /([+-]\d\+\.\d\+[+-]\d\+\.\d\+i)/
syn match bruijnDefinition /^\t*\S\+/
syn match bruijnType /\( ⧗ \)\@<=.*$/
syn match bruijnTypeDelim / ⧗ /
syn match bruijnKeyword /:test\|:import\|:input/
syn match bruijnNamespace /[A-Z][a-z]*\(\.\)\@=/
syn match bruijnNamespaceDelim /\([A-Z][a-z]*\)\@<=\./

syn region bruijnCommentLine start="^# " end="$" oneline
syn region bruijnString start=+"+ end=+"+ oneline

hi def link bruijnIndex Special
hi def link bruijnNumber Number
hi def link bruijnFloat Number
hi def link bruijnComplex Number
hi def link bruijnString String
hi def link bruijnChar String
hi def link bruijnDefinition Define
hi def link bruijnType Structure
hi def link bruijnTypeDelim Define
hi def link bruijnKeyword Macro
hi def link bruijnNamespace Type
hi def link bruijnNamespaceDelim Special
hi def link bruijnAbstraction Function
hi def link bruijnApplication Statement
hi def link bruijnCommentLine Comment

" complete using space or C-]
abbreviate <buffer> :: ⧗
abbreviate <buffer> > ‣
abbreviate <buffer> <> ∅
abbreviate <buffer> ? …
abbreviate <buffer> && ⋀
abbreviate <buffer> \|\| ⋁
abbreviate <buffer> sum ∑
abbreviate <buffer> prod ∏
abbreviate <buffer> rprod ∐
abbreviate <buffer> infty ∞
abbreviate <buffer> . ∘
abbreviate <buffer> * ⋅
abbreviate <buffer> ** ⋆
abbreviate <buffer> => ⇒
abbreviate <buffer> <=> ⇔
abbreviate <buffer> -> →
abbreviate <buffer> <-> ↔
abbreviate <buffer> -^ ↑
abbreviate <buffer> bra ⟨
abbreviate <buffer> ket ⟩
abbreviate <buffer> bbra ⟪
abbreviate <buffer> kket ⟫
abbreviate <buffer> <=? ≤
abbreviate <buffer> >=? ≥
abbreviate <buffer> /= ≠
abbreviate <buffer> ~= ≈
abbreviate <buffer> ! ¬
abbreviate <buffer> _0 ₀
abbreviate <buffer> _1 ₁
abbreviate <buffer> _2 ₂
abbreviate <buffer> _3 ₃
abbreviate <buffer> _4 ₄
abbreviate <buffer> _5 ₅
abbreviate <buffer> _6 ₆
abbreviate <buffer> _7 ₇
abbreviate <buffer> _8 ₈
abbreviate <buffer> _9 ₉
abbreviate <buffer> _+ ₊
abbreviate <buffer> _- ₋
abbreviate <buffer> _= ₌
abbreviate <buffer> _( ₍
abbreviate <buffer> _) ₎
abbreviate <buffer> ^0 ⁰
abbreviate <buffer> ^1 ¹
abbreviate <buffer> ^2 ²
abbreviate <buffer> ^3 ³
abbreviate <buffer> ^4 ⁴
abbreviate <buffer> ^5 ⁵
abbreviate <buffer> ^6 ⁶
abbreviate <buffer> ^7 ⁷
abbreviate <buffer> ^8 ⁸
abbreviate <buffer> ^9 ⁹
abbreviate <buffer> ^+ ⁺
abbreviate <buffer> ^- ⁻
abbreviate <buffer> ^= ⁼
abbreviate <buffer> ^( ⁽
abbreviate <buffer> ^) ⁾

" === Greek letters === 
abbreviate <buffer> Alpha Α
abbreviate <buffer> alpha α
abbreviate <buffer> Beta Β
abbreviate <buffer> beta β
abbreviate <buffer> Gamma Γ
abbreviate <buffer> gamma γ
abbreviate <buffer> Delta Δ
abbreviate <buffer> delta δ
abbreviate <buffer> Epsilon Ε
abbreviate <buffer> epsilon ε
abbreviate <buffer> varepsilon ϵ
abbreviate <buffer> Zeta Ζ
abbreviate <buffer> zeta ζ
abbreviate <buffer> Eta Η
abbreviate <buffer> eta η
abbreviate <buffer> Theta Θ
abbreviate <buffer> theta θ
abbreviate <buffer> Iota Ι
abbreviate <buffer> iota ι
abbreviate <buffer> Kappa Κ
abbreviate <buffer> kappa κ
abbreviate <buffer> Lambda Λ
abbreviate <buffer> lambda λ
abbreviate <buffer> Mu Μ
abbreviate <buffer> mu μ
abbreviate <buffer> Nu Ν
abbreviate <buffer> nu ν
abbreviate <buffer> Xi Ξ
abbreviate <buffer> xi ξ
abbreviate <buffer> Omicron Ο
abbreviate <buffer> omicron ο
abbreviate <buffer> Pi Π
abbreviate <buffer> pi π
abbreviate <buffer> Rho Ρ
abbreviate <buffer> rho ρ
abbreviate <buffer> Sigma Σ
abbreviate <buffer> sigma σ
abbreviate <buffer> Tau Τ
abbreviate <buffer> tau τ
abbreviate <buffer> Upsilon Υ
abbreviate <buffer> upsilon υ
abbreviate <buffer> Phi Φ
abbreviate <buffer> phi φ
abbreviate <buffer> varphi ϕ
abbreviate <buffer> Chi Χ
abbreviate <buffer> chi χ
abbreviate <buffer> Psi Ψ
abbreviate <buffer> psi ψ
abbreviate <buffer> Omega Ω
abbreviate <buffer> omega ω

" let b:current_syntax = "bruijn"
" let &cpo = s:cpo_save
" unlet! s:cpo_save