neovim/runtime/syntax/unison.vim

104 lines
5.6 KiB
VimL
Raw Normal View History

" Vim syntax file
"
" Language: unison
" Maintainer: Anton Parkhomenko <anton@chuwy.me>
" Last Change: Aug 7, 2023
" Original Author: John Williams, Paul Chiusano and Rúnar Bjarnason
if exists("b:current_syntax")
finish
endif
syntax include @markdown $VIMRUNTIME/syntax/markdown.vim
syn cluster markdownLikeDocs contains=markdownBold,markdownItalic,markdownLinkText,markdownListMarker,markdownOrderedListMarker,markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6
syn match unisonOperator "[-!#$%&\*\+/<=>\?@\\^|~]"
syn match unisonDelimiter "[\[\](){},.]"
" Strings and constants
syn match unisonSpecialChar contained "\\\([0-9]\+\|o[0-7]\+\|x[0-9a-fA-F]\+\|[\"\\'&\\abfnrtv]\|^[A-Z^_\[\\\]]\)"
syn match unisonSpecialChar contained "\\\(NUL\|SOH\|STX\|ETX\|EOT\|ENQ\|ACK\|BEL\|BS\|HT\|LF\|VT\|FF\|CR\|SO\|SI\|DLE\|DC1\|DC2\|DC3\|DC4\|NAK\|SYN\|ETB\|CAN\|EM\|SUB\|ESC\|FS\|GS\|RS\|US\|SP\|DEL\)"
syn match unisonSpecialCharError contained "\\&\|'''\+"
syn region unisonString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=unisonSpecialChar
syn match unisonCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=unisonSpecialChar,unisonSpecialCharError
syn match unisonCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=unisonSpecialChar,unisonSpecialCharError
syn match unisonNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
syn match unisonFloat "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
" Keyword definitions. These must be patterns instead of keywords
" because otherwise they would match as keywords at the start of a
" "literate" comment (see lu.vim).
syn match unisonModule "\<namespace\>"
syn match unisonImport "\<use\>"
syn match unisonTypedef "\<\(unique\|structural\|∀\|forall\)\>"
syn match unisonStatement "\<\(ability\|do\|type\|where\|match\|cases\|;\|let\|with\|handle\)\>"
syn match unisonConditional "\<\(if\|else\|then\)\>"
syn match unisonBoolean "\<\(true\|false\)\>"
syn match unisonType "\<\C[A-Z][0-9A-Za-z_'!]*\>"
syn match unisonName "\<\C[a-z_][0-9A-Za-z_'!]*\>"
" Comments
syn match unisonLineComment "---*\([^-!#$%&\*\+./<=>\?@\\^|~].*\)\?$"
syn region unisonBlockComment start="{-" end="-}" contains=unisonBlockComment
syn region unisonBelowFold start="^---" skip="." end="." contains=unisonBelowFold
" Docs
syn region unisonDocBlock matchgroup=unisonDoc start="{{" end="}}" contains=unisonDocTypecheck,unisonDocQuasiquote,unisonDocDirective,unisonDocCode,unisonDocCodeInline,unisonDocCodeRaw,unisonDocMono,@markdownLikeDocs
syn region unisonDocQuasiquote contained matchgroup=unisonDocQuote start="{{" end= "}}" contains=TOP
syn region unisonDocCode contained matchgroup=unisonDocCode start="^\s*```\s*$" end="^\s*```\s*$" contains=TOP
syn region unisonDocTypecheck contained matchgroup=unisonDocCode start="^\s*@typecheck\s*```\s*$" end="^\s*```\s*$" contains=TOP
syn region unisonDocCodeRaw contained matchgroup=unisonDocCode start="^\s*```\s*raw\s*$" end="^\s*```\s*$" contains=NoSyntax
syn region unisonDocCodeInline contained matchgroup=unisonDocCode start="`\@<!``" end="`\@<!``" contains=TOP
syn match unisonDocMono "''[^']*''"
syn region unisonDocDirective contained matchgroup=unisonDocDirective start="\(@\([a-zA-Z0-9_']*\)\)\?{{\@!" end="}" contains=TOP
syn match unisonDebug "\<\(todo\|bug\|Debug.trace\|Debug.evalToText\)\>"
" things like
" > my_func 1 3
" test> Function.tap.tests.t1 = check let
" use Nat == +
" ( 99, 100 ) === (withInitialValue 0 do
" : : :
syn match unisonWatch "^[A-Za-z]*>"
hi def link unisonWatch Debug
hi def link unisonDocMono Delimiter
hi def link unisonDocDirective Import
hi def link unisonDocQuote Delimiter
hi def link unisonDocCode Delimiter
hi def link unisonDoc String
hi def link unisonBelowFold Comment
hi def link unisonBlockComment Comment
hi def link unisonBoolean Boolean
hi def link unisonCharacter Character
hi def link unisonComment Comment
hi def link unisonConditional Conditional
hi def link unisonConditional Conditional
hi def link unisonDebug Debug
hi def link unisonDelimiter Delimiter
hi def link unisonDocBlock String
hi def link unisonDocDirective Import
hi def link unisonDocIncluded Import
hi def link unisonFloat Float
hi def link unisonImport Include
hi def link unisonLineComment Comment
hi def link unisonLink Type
hi def link unisonName Identifier
hi def link unisonNumber Number
hi def link unisonOperator Operator
hi def link unisonSpecialChar SpecialChar
hi def link unisonSpecialCharError Error
hi def link unisonStatement Statement
hi def link unisonString String
hi def link unisonType Type
hi def link unisonTypedef Typedef
let b:current_syntax = "unison"
" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim