blob: 41d491c65743a7a4b6b186b85ccbb7155c152488 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Scheme (R5RS)
Bram Moolenaar21cf8232004-07-16 20:18:37 +00003" Last Change: July 14, 2004
4" Maintainer: Sergey Khorev <iamphet@nm.ru>
5" Original author: Dirk van Deun <dirk@igwe.vub.ac.be>
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
7" This script incorrectly recognizes some junk input as numerals:
8" parsing the complete system of Scheme numerals using the pattern
9" language is practically impossible: I did a lax approximation.
Bram Moolenaar21cf8232004-07-16 20:18:37 +000010
11" MzScheme extensions can be activated with setting is_mzscheme variable
Bram Moolenaar071d4272004-06-13 20:20:40 +000012
13" Suggestions and bug reports are solicited by the author.
14
15" Initializing:
16
17" For version 5.x: Clear all syntax items
18" For version 6.x: Quit when a syntax file was already loaded
19if version < 600
20 syntax clear
21elseif exists("b:current_syntax")
22 finish
23endif
24
25syn case ignore
26
27" Fascist highlighting: everything that doesn't fit the rules is an error...
28
Bram Moolenaar21cf8232004-07-16 20:18:37 +000029syn match schemeError oneline ![^ \t()\[\]";]*!
Bram Moolenaar071d4272004-06-13 20:20:40 +000030syn match schemeError oneline ")"
31
32" Quoted and backquoted stuff
33
Bram Moolenaar21cf8232004-07-16 20:18:37 +000034syn region schemeQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
Bram Moolenaar071d4272004-06-13 20:20:40 +000035
36syn region schemeQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
37syn region schemeQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
38
39syn region schemeStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
40syn region schemeStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
41
Bram Moolenaar21cf8232004-07-16 20:18:37 +000042" Popular Scheme extension:
43" using [] as well as ()
44syn region schemeStrucRestricted matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
45syn region schemeStrucRestricted matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
Bram Moolenaar071d4272004-06-13 20:20:40 +000046
Bram Moolenaar21cf8232004-07-16 20:18:37 +000047syn region schemeUnquote matchgroup=Delimiter start="," end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
48syn region schemeUnquote matchgroup=Delimiter start=",@" end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
49
50syn region schemeUnquote matchgroup=Delimiter start=",(" end=")" contains=ALL
51syn region schemeUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALL
Bram Moolenaar071d4272004-06-13 20:20:40 +000052
53syn region schemeUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
54syn region schemeUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
55
Bram Moolenaar21cf8232004-07-16 20:18:37 +000056syn region schemeUnquote matchgroup=Delimiter start=",\[" end="\]" contains=ALL
57syn region schemeUnquote matchgroup=Delimiter start=",@\[" end="\]" contains=ALL
58
59syn region schemeUnquote matchgroup=Delimiter start=",#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
60syn region schemeUnquote matchgroup=Delimiter start=",@#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
61
Bram Moolenaar071d4272004-06-13 20:20:40 +000062" R5RS Scheme Functions and Syntax:
63
64if version < 600
65 set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
66else
67 setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
68endif
69
70syn keyword schemeSyntax lambda and or if cond case define let let* letrec
71syn keyword schemeSyntax begin do delay set! else =>
72syn keyword schemeSyntax quote quasiquote unquote unquote-splicing
73syn keyword schemeSyntax define-syntax let-syntax letrec-syntax syntax-rules
74
75syn keyword schemeFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
76syn keyword schemeFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
77syn keyword schemeFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
78syn keyword schemeFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
79syn keyword schemeFunc cddaar cddadr cdddar cddddr null? list? list length
80syn keyword schemeFunc append reverse list-ref memq memv member assq assv assoc
81syn keyword schemeFunc symbol? symbol->string string->symbol number? complex?
82syn keyword schemeFunc real? rational? integer? exact? inexact? = < > <= >=
83syn keyword schemeFunc zero? positive? negative? odd? even? max min + * - / abs
84syn keyword schemeFunc quotient remainder modulo gcd lcm numerator denominator
85syn keyword schemeFunc floor ceiling truncate round rationalize exp log sin cos
86syn keyword schemeFunc tan asin acos atan sqrt expt make-rectangular make-polar
87syn keyword schemeFunc real-part imag-part magnitude angle exact->inexact
88syn keyword schemeFunc inexact->exact number->string string->number char=?
89syn keyword schemeFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
90syn keyword schemeFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
91syn keyword schemeFunc char-numeric? char-whitespace? char-upper-case?
92syn keyword schemeFunc char-lower-case?
93syn keyword schemeFunc char->integer integer->char char-upcase char-downcase
94syn keyword schemeFunc string? make-string string string-length string-ref
95syn keyword schemeFunc string-set! string=? string-ci=? string<? string-ci<?
96syn keyword schemeFunc string>? string-ci>? string<=? string-ci<=? string>=?
97syn keyword schemeFunc string-ci>=? substring string-append vector? make-vector
98syn keyword schemeFunc vector vector-length vector-ref vector-set! procedure?
99syn keyword schemeFunc apply map for-each call-with-current-continuation
100syn keyword schemeFunc call-with-input-file call-with-output-file input-port?
101syn keyword schemeFunc output-port? current-input-port current-output-port
102syn keyword schemeFunc open-input-file open-output-file close-input-port
103syn keyword schemeFunc close-output-port eof-object? read read-char peek-char
104syn keyword schemeFunc write display newline write-char call/cc
105syn keyword schemeFunc list-tail string->list list->string string-copy
106syn keyword schemeFunc string-fill! vector->list list->vector vector-fill!
107syn keyword schemeFunc force with-input-from-file with-output-to-file
108syn keyword schemeFunc char-ready? load transcript-on transcript-off eval
109syn keyword schemeFunc dynamic-wind port? values call-with-values
110syn keyword schemeFunc scheme-report-environment null-environment
111syn keyword schemeFunc interaction-environment
112
Bram Moolenaar071d4272004-06-13 20:20:40 +0000113" ... so that a single + or -, inside a quoted context, would not be
114" interpreted as a number (outside such contexts, it's a schemeFunc)
115
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000116syn match schemeDelimiter oneline !\.[ \t\[\]()";]!me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117syn match schemeDelimiter oneline !\.$!
118" ... and a single dot is not a number but a delimiter
119
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
121
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000122syn match schemeOther oneline ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*,
123syn match schemeError oneline ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124
125syn match schemeOther oneline "\.\.\."
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000126syn match schemeError oneline !\.\.\.[^ \t\[\]()";]\+!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127" ... a special identifier
128
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000129syn match schemeConstant oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[ \t\[\]()";],me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130syn match schemeConstant oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*$,
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000131syn match schemeError oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000133syn match schemeConstant oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t\[\]()";],me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134syn match schemeConstant oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000135syn match schemeError oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
137" Non-quoted lists, and strings:
138
139syn region schemeStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
140syn region schemeStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
141
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000142syn region schemeStruc matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALL
143syn region schemeStruc matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALL
144
145" Simple literals:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146syn region schemeString start=+"+ skip=+\\[\\"]+ end=+"+
147
148" Comments:
149
150syn match schemeComment ";.*$"
151
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000152
153" Writing out the complete description of Scheme numerals without
154" using variables is a day's work for a trained secretary...
155
156syn match schemeOther oneline ![+-][ \t\[\]()";]!me=e-1
157syn match schemeOther oneline ![+-]$!
158"
159" This is a useful lax approximation:
160syn match schemeNumber oneline "[-#+0-9.][-#+/0-9a-f@i.boxesfdl]*"
161syn match schemeError oneline ![-#+0-9.][-#+/0-9a-f@i.boxesfdl]*[^-#+/0-9a-f@i.boxesfdl \t\[\]()";][^ \t\[\]()";]*!
162
163syn match schemeBoolean oneline "#[tf]"
164syn match schemeError oneline !#[tf][^ \t\[\]()";]\+!
165
166syn match schemeChar oneline "#\\"
167syn match schemeChar oneline "#\\."
168syn match schemeError oneline !#\\.[^ \t\[\]()";]\+!
169syn match schemeChar oneline "#\\space"
170syn match schemeError oneline !#\\space[^ \t\[\]()";]\+!
171syn match schemeChar oneline "#\\newline"
172syn match schemeError oneline !#\\newline[^ \t\[\]()";]\+!
173
174if exists("b:is_mzscheme") || exists("is_mzscheme")
175 " MzScheme extensions added by Sergey Khorev
176 " multiline comment
177 syntax region schemeMultilineComment start=/#|/ end=/|#/
178 " #%xxx are the special MzScheme identifiers
179 syn match schemeOther oneline "#%[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
180 " anything limited by |'s is identifier
181 syn match schemeOther oneline "|[^|]\+|"
182
183 syn match schemeChar oneline "#\\return"
184
185 " Modules require stmt
186 syn keyword schemeExtSyntax module require dynamic-require lib prefix all-except prefix-all-except rename
187 " modules provide stmt
188 syn keyword schemeExtSyntax provide struct all-from all-from-except all-defined all-defined-except
189 " Other from MzScheme
190 syn keyword schemeExtSyntax with-handlers when unless instantiate define-struct case-lambda syntax-case
191 syn keyword schemeExtSyntax free-identifier=? bound-identifier=? module-identifier=? syntax-object->datum
192 syn keyword schemeExtSyntax datum->syntax-object
193 syn keyword schemeExtSyntax let-values let*-values letrec-values set!-values fluid-let parameterize begin0
194 syn keyword schemeExtSyntax error raise opt-lambda define-values unit unit/sig define-signature
195 syn keyword schemeExtSyntax invoke-unit/sig define-values/invoke-unit/sig compound-unit/sig import export
196 syn keyword schemeExtSyntax link syntax quasisyntax unsyntax with-syntax
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000197
198 syn keyword schemeExtFunc format system-type current-extension-compiler current-extension-linker
199 syn keyword schemeExtFunc use-standard-linker use-standard-compiler
200 syn keyword schemeExtFunc find-executable-path append-object-suffix append-extension-suffix
201 syn keyword schemeExtFunc current-library-collection-paths current-extension-compiler-flags make-parameter
202 syn keyword schemeExtFunc current-directory build-path normalize-path current-extension-linker-flags
203 syn keyword schemeExtFunc file-exists? directory-exists? delete-directory/files delete-directory delete-file
204 syn keyword schemeExtFunc system compile-file system-library-subpath getenv putenv current-standard-link-libraries
205 syn keyword schemeExtFunc remove* file-size find-files fold-files directory-list shell-execute split-path
206 syn keyword schemeExtFunc current-error-port process/ports process printf fprintf open-input-string open-output-string
207 syn keyword schemeExtFunc get-output-string
208 " exceptions
209 syn keyword schemeExtFunc exn exn:application:arity exn:application:continuation exn:application:fprintf:mismatch
210 syn keyword schemeExtFunc exn:application:mismatch exn:application:type exn:application:mismatch exn:break exn:i/o:filesystem exn:i/o:port
211 syn keyword schemeExtFunc exn:i/o:port:closed exn:i/o:tcp exn:i/o:udp exn:misc exn:misc:application exn:misc:unsupported exn:module exn:read
212 syn keyword schemeExtFunc exn:read:non-char exn:special-comment exn:syntax exn:thread exn:user exn:variable exn:application:mismatch
213 syn keyword schemeExtFunc exn? exn:application:arity? exn:application:continuation? exn:application:fprintf:mismatch? exn:application:mismatch?
214 syn keyword schemeExtFunc exn:application:type? exn:application:mismatch? exn:break? exn:i/o:filesystem? exn:i/o:port? exn:i/o:port:closed?
215 syn keyword schemeExtFunc exn:i/o:tcp? exn:i/o:udp? exn:misc? exn:misc:application? exn:misc:unsupported? exn:module? exn:read? exn:read:non-char?
216 syn keyword schemeExtFunc exn:special-comment? exn:syntax? exn:thread? exn:user? exn:variable? exn:application:mismatch?
217 " Command-line parsing
218 syn keyword schemeExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000219
220 " syntax quoting, unquoting and quasiquotation
221 syn region schemeUnquote matchgroup=Delimiter start="#," end=![ \t\[\]()";]!me=e-1 contains=ALL
222 syn region schemeUnquote matchgroup=Delimiter start="#,@" end=![ \t\[\]()";]!me=e-1 contains=ALL
223 syn region schemeUnquote matchgroup=Delimiter start="#,(" end=")" contains=ALL
224 syn region schemeUnquote matchgroup=Delimiter start="#,@(" end=")" contains=ALL
225 syn region schemeUnquote matchgroup=Delimiter start="#,\[" end="\]" contains=ALL
226 syn region schemeUnquote matchgroup=Delimiter start="#,@\[" end="\]" contains=ALL
227 syn region schemeQuoted matchgroup=Delimiter start="#['`]" end=![ \t()\[\]";]!me=e-1 contains=ALL
228 syn region schemeQuoted matchgroup=Delimiter start="#['`](" matchgroup=Delimiter end=")" contains=ALL
229endif
230
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000231
232if exists("b:is_chicken") || exists("is_chicken")
233 syn match schemeOther oneline "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
234 syn match schemeExtSyntax oneline "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
235
236 syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec
237 syn keyword schemeExtSyntax foreign-lambda foreign-lambda*
238 syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable
239 syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno
240
241 " here-string
242 syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+
243
244 if filereadable(expand("<sfile>:p:h")."/cpp.vim")
245 unlet! b:current_syntax
246 syn include @ChickenC <sfile>:p:h/cpp.vim
247 syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC
248 syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC
249 syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC
250 syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC
251 syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC
252 syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC
253 syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC
254 syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC
255 syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC
256 syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC
257 syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC
258 endif
259
260endif
261
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262" Synchronization and the wrapping up...
263
264syn sync match matchPlace grouphere NONE "^[^ \t]"
265" ... i.e. synchronize on a line that starts at the left margin
266
267" Define the default highlighting.
268" For version 5.7 and earlier: only when not done already
269" For version 5.8 and later: only when an item doesn't have highlighting yet
270if version >= 508 || !exists("did_scheme_syntax_inits")
271 if version < 508
272 let did_scheme_syntax_inits = 1
273 command -nargs=+ HiLink hi link <args>
274 else
275 command -nargs=+ HiLink hi def link <args>
276 endif
277
278 HiLink schemeSyntax Statement
279 HiLink schemeFunc Function
280
281 HiLink schemeString String
282 HiLink schemeChar Character
283 HiLink schemeNumber Number
284 HiLink schemeBoolean Boolean
285
286 HiLink schemeDelimiter Delimiter
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000287 HiLink schemeConstant Constant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288
289 HiLink schemeComment Comment
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000290 HiLink schemeMultilineComment Comment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291 HiLink schemeError Error
292
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000293 HiLink schemeExtSyntax Type
294 HiLink schemeExtFunc PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295 delcommand HiLink
296endif
297
298let b:current_syntax = "scheme"