summaryrefslogtreecommitdiffstats
path: root/syntax/nim.vim
blob: 868da69d2546404dc58539267f27d775b2ee008e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nim') == -1
  
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

" Keep user-supplied options
if !exists("nim_highlight_numbers")
  let nim_highlight_numbers = 1
endif
if !exists("nim_highlight_builtins")
  let nim_highlight_builtins = 1
endif
if !exists("nim_highlight_exceptions")
  let nim_highlight_exceptions = 1
endif
if !exists("nim_highlight_space_errors")
  let nim_highlight_space_errors = 1
endif

if exists("nim_highlight_all")
  let nim_highlight_numbers      = 1
  let nim_highlight_builtins     = 1
  let nim_highlight_exceptions   = 1
  let nim_highlight_space_errors = 1
endif

syn region nimBrackets       contained extend keepend matchgroup=Bold start=+\(\\\)\@<!\[+ end=+]\|$+ skip=+\\\s*$\|\(\\\)\@<!\\]+ contains=@tclCommandCluster

syn keyword nimKeyword       addr and as asm atomic
syn keyword nimKeyword       bind block break
syn keyword nimKeyword       case cast const continue converter
syn keyword nimKeyword       discard distinct div do
syn keyword nimKeyword       elif else end enum except export
syn keyword nimKeyword       finally for from
syn keyword nimKeyword       generic
syn keyword nimKeyword       if import in include interface is isnot iterator
syn keyword nimKeyword       lambda let
syn keyword nimKeyword       mixin using mod
syn keyword nimKeyword       nil not notin
syn keyword nimKeyword       object of or out
syn keyword nimKeyword       proc method macro template nextgroup=nimFunction skipwhite
syn keyword nimKeyword       ptr
syn keyword nimKeyword       raise ref return
syn keyword nimKeyword       shared shl shr static
syn keyword nimKeyword       try tuple type
syn keyword nimKeyword       var
syn keyword nimKeyword       when while with without
syn keyword nimKeyword       xor
syn keyword nimKeyword       yield

syn match   nimFunction      "[a-zA-Z_][a-zA-Z0-9_]*" contained
syn match   nimClass         "[a-zA-Z_][a-zA-Z0-9_]*" contained
syn keyword nimRepeat        for while
syn keyword nimConditional   if elif else case of
syn keyword nimOperator      and in is not or xor shl shr div
syn match   nimComment       "#.*$" contains=nimTodo,@Spell
syn keyword nimTodo          TODO FIXME XXX contained
syn keyword nimBoolean       true false


" Strings
syn region nimString start=+'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=nimEscape,nimEscapeError,@Spell
syn region nimString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=nimEscape,nimEscapeError,@Spell
syn region nimString start=+"""+ end=+"""+ keepend contains=nimEscape,nimEscapeError,@Spell
syn region nimRawString matchgroup=Normal start=+[rR]"+ end=+"+ skip=+\\\\\|\\"+ contains=@Spell

syn match  nimEscape		+\\[abfnrtv'"\\]+ contained
syn match  nimEscape		"\\\o\{1,3}" contained
syn match  nimEscape		"\\x\x\{2}" contained
syn match  nimEscape		"\(\\u\x\{4}\|\\U\x\{8}\)" contained
syn match  nimEscape		"\\$"

syn match nimEscapeError "\\x\x\=\X" display contained

if nim_highlight_numbers == 1
  " numbers (including longs and complex)
  syn match   nimNumber	"\v<0x\x+(\'(i|I|f|F|u|U)(8|16|32|64))?>"
  syn match   nimNumber	"\v<[0-9_]+(\'(i|I|f|F|u|U)(8|16|32|64))?>"
  syn match   nimNumber	"\v[0-9]\.[0-9_]+([eE][+-]=[0-9_]+)=>"
  syn match   nimNumber	"\v<[0-9_]+(\.[0-9_]+)?([eE][+-]?[0-9_]+)?(\'(f|F)(32|64))?>"
endif

if nim_highlight_builtins == 1
  " builtin functions, types and objects, not really part of the syntax
  syn keyword nimBuiltin int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool
  syn keyword nimBuiltin char string cstring pointer range array openarray seq
  syn keyword nimBuiltin set Byte Natural Positive TObject PObject Conversion TResult TAddress
  syn keyword nimBuiltin BiggestInt BiggestFloat cchar cschar cshort cint csize cuchar cushort
  syn keyword nimBuiltin clong clonglong cfloat cdouble clongdouble cuint culong culonglong cchar
  syn keyword nimBuiltin cstringArray TEndian PFloat32 PFloat64 PInt64 PInt32
  syn keyword nimBuiltin TGC_Strategy TFile TFileMode TFileHandle isMainModule
  syn keyword nimBuiltin CompileDate CompileTime nimVersion nimMajor
  syn keyword nimBuiltin nimMinor nimPatch cpuEndian hostOS hostCPU inf
  syn keyword nimBuiltin neginf nan QuitSuccess QuitFailure dbgLineHook stdin
  syn keyword nimBuiltin stdout stderr defined new high low sizeof succ pred
  syn keyword nimBuiltin inc dec newSeq len incl excl card ord chr ze ze64
  syn keyword nimBuiltin toU8 toU16 toU32 abs min max add repr
  syn match   nimBuiltin "\<contains\>"
  syn keyword nimBuiltin toFloat toBiggestFloat toInt toBiggestInt addQuitProc
  syn keyword nimBuiltin copy setLen newString zeroMem copyMem moveMem
  syn keyword nimBuiltin equalMem alloc alloc0 realloc dealloc setLen assert
  syn keyword nimBuiltin swap getRefcount getCurrentException Msg
  syn keyword nimBuiltin getOccupiedMem getFreeMem getTotalMem isNil seqToPtr
  syn keyword nimBuiltin find pop GC_disable GC_enable GC_fullCollect
  syn keyword nimBuiltin GC_setStrategy GC_enableMarkAnd Sweep
  syn keyword nimBuiltin GC_disableMarkAnd Sweep GC_getStatistics GC_ref
  syn keyword nimBuiltin GC_ref GC_ref GC_unref GC_unref GC_unref quit
  syn keyword nimBuiltin OpenFile OpenFile CloseFile EndOfFile readChar
  syn keyword nimBuiltin FlushFile readFile write readLine writeln writeln
  syn keyword nimBuiltin getFileSize ReadBytes ReadChars readBuffer writeBytes
  syn keyword nimBuiltin writeChars writeBuffer setFilePos getFilePos
  syn keyword nimBuiltin fileHandle countdown countup items lines
endif

if nim_highlight_exceptions == 1
  " builtin exceptions and warnings
  syn keyword nimException E_Base EAsynch ESynch ESystem EIO EOS
  syn keyword nimException ERessourceExhausted EArithmetic EDivByZero
  syn keyword nimException EOverflow EAccessViolation EAssertionFailed
  syn keyword nimException EControlC EInvalidValue EOutOfMemory EInvalidIndex
  syn keyword nimException EInvalidField EOutOfRange EStackOverflow
  syn keyword nimException ENoExceptionToReraise EInvalidObjectAssignment
  syn keyword nimException EInvalidObject EInvalidLibrary EInvalidKey
  syn keyword nimException EInvalidObjectConversion EFloatingPoint
  syn keyword nimException EFloatInvalidOp EFloatDivByZero EFloatOverflow
  syn keyword nimException EFloatInexact EDeadThread EResourceExhausted
  syn keyword nimException EFloatUnderflow
endif

if nim_highlight_space_errors == 1
  " trailing whitespace
  syn match   nimSpaceError   display excludenl "\S\s\+$"ms=s+1
  " any tabs are illegal in nim
  syn match   nimSpaceError   display "\t"
endif

syn sync match nimSync grouphere NONE "):$"
syn sync maxlines=200
syn sync minlines=2000

if version >= 508 || !exists("did_nim_syn_inits")
  if version <= 508
    let did_nim_syn_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  " The default methods for highlighting.  Can be overridden later
  HiLink nimBrackets       Operator
  HiLink nimKeyword	      Keyword
  HiLink nimFunction	    	Function
  HiLink nimConditional	  Conditional
  HiLink nimRepeat		      Repeat
  HiLink nimString		      String
  HiLink nimRawString	    String
  HiLink nimBoolean        Boolean
  HiLink nimEscape		      Special
  HiLink nimOperator		    Operator
  HiLink nimPreCondit	    PreCondit
  HiLink nimComment		    Comment
  HiLink nimTodo		        Todo
  HiLink nimDecorator	    Define
  
  if nim_highlight_numbers == 1
    HiLink nimNumber	Number
  endif
  
  if nim_highlight_builtins == 1
    HiLink nimBuiltin	Number
  endif
  
  if nim_highlight_exceptions == 1
    HiLink nimException	Exception
  endif
  
  if nim_highlight_space_errors == 1
    HiLink nimSpaceError	Error
  endif

  delcommand HiLink
endif

let b:current_syntax = "nim"


endif