xref: /vim-8.2.3635/runtime/syntax/scheme.vim (revision cb03397a)
1" Vim syntax file
2" Language:	Scheme (R5RS + some R6RS extras)
3" Last Change:	2016 May 23
4" Maintainer:	Sergey Khorev <[email protected]>
5" Original author:	Dirk van Deun <[email protected]>
6
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.
10
11" MzScheme extensions can be activated with setting is_mzscheme variable
12
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
25let s:cpo_save = &cpo
26set cpo&vim
27
28syn case ignore
29
30" Fascist highlighting: everything that doesn't fit the rules is an error...
31
32syn match	schemeError	![^ \t()\[\]";]*!
33syn match	schemeError	")"
34
35" Quoted and backquoted stuff
36
37syn region schemeQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
38
39syn region schemeQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
40syn region schemeQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
41
42syn region schemeStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
43syn region schemeStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
44
45" Popular Scheme extension:
46" using [] as well as ()
47syn region schemeStrucRestricted matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
48syn region schemeStrucRestricted matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
49
50syn region schemeUnquote matchgroup=Delimiter start="," end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
51syn region schemeUnquote matchgroup=Delimiter start=",@" end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
52
53syn region schemeUnquote matchgroup=Delimiter start=",(" end=")" contains=ALL
54syn region schemeUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALL
55
56syn region schemeUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
57syn region schemeUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
58
59syn region schemeUnquote matchgroup=Delimiter start=",\[" end="\]" contains=ALL
60syn region schemeUnquote matchgroup=Delimiter start=",@\[" end="\]" contains=ALL
61
62syn region schemeUnquote matchgroup=Delimiter start=",#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
63syn region schemeUnquote matchgroup=Delimiter start=",@#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
64
65" R5RS Scheme Functions and Syntax:
66
67if version < 600
68  set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
69else
70  setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
71endif
72
73syn keyword schemeSyntax lambda and or if cond case define let let* letrec
74syn keyword schemeSyntax begin do delay set! else =>
75syn keyword schemeSyntax quote quasiquote unquote unquote-splicing
76syn keyword schemeSyntax define-syntax let-syntax letrec-syntax syntax-rules
77" R6RS
78syn keyword schemeSyntax define-record-type fields protocol
79
80syn keyword schemeFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
81syn keyword schemeFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
82syn keyword schemeFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
83syn keyword schemeFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
84syn keyword schemeFunc cddaar cddadr cdddar cddddr null? list? list length
85syn keyword schemeFunc append reverse list-ref memq memv member assq assv assoc
86syn keyword schemeFunc symbol? symbol->string string->symbol number? complex?
87syn keyword schemeFunc real? rational? integer? exact? inexact? = < > <= >=
88syn keyword schemeFunc zero? positive? negative? odd? even? max min + * - / abs
89syn keyword schemeFunc quotient remainder modulo gcd lcm numerator denominator
90syn keyword schemeFunc floor ceiling truncate round rationalize exp log sin cos
91syn keyword schemeFunc tan asin acos atan sqrt expt make-rectangular make-polar
92syn keyword schemeFunc real-part imag-part magnitude angle exact->inexact
93syn keyword schemeFunc inexact->exact number->string string->number char=?
94syn keyword schemeFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
95syn keyword schemeFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
96syn keyword schemeFunc char-numeric? char-whitespace? char-upper-case?
97syn keyword schemeFunc char-lower-case?
98syn keyword schemeFunc char->integer integer->char char-upcase char-downcase
99syn keyword schemeFunc string? make-string string string-length string-ref
100syn keyword schemeFunc string-set! string=? string-ci=? string<? string-ci<?
101syn keyword schemeFunc string>? string-ci>? string<=? string-ci<=? string>=?
102syn keyword schemeFunc string-ci>=? substring string-append vector? make-vector
103syn keyword schemeFunc vector vector-length vector-ref vector-set! procedure?
104syn keyword schemeFunc apply map for-each call-with-current-continuation
105syn keyword schemeFunc call-with-input-file call-with-output-file input-port?
106syn keyword schemeFunc output-port? current-input-port current-output-port
107syn keyword schemeFunc open-input-file open-output-file close-input-port
108syn keyword schemeFunc close-output-port eof-object? read read-char peek-char
109syn keyword schemeFunc write display newline write-char call/cc
110syn keyword schemeFunc list-tail string->list list->string string-copy
111syn keyword schemeFunc string-fill! vector->list list->vector vector-fill!
112syn keyword schemeFunc force with-input-from-file with-output-to-file
113syn keyword schemeFunc char-ready? load transcript-on transcript-off eval
114syn keyword schemeFunc dynamic-wind port? values call-with-values
115syn keyword schemeFunc scheme-report-environment null-environment
116syn keyword schemeFunc interaction-environment
117" R6RS
118syn keyword schemeFunc make-eq-hashtable make-eqv-hashtable make-hashtable
119syn keyword schemeFunc hashtable? hashtable-size hashtable-ref hashtable-set!
120syn keyword schemeFunc hashtable-delete! hashtable-contains? hashtable-update!
121syn keyword schemeFunc hashtable-copy hashtable-clear! hashtable-keys
122syn keyword schemeFunc hashtable-entries hashtable-equivalence-function hashtable-hash-function
123syn keyword schemeFunc hashtable-mutable? equal-hash string-hash string-ci-hash symbol-hash
124syn keyword schemeFunc find for-all exists filter partition fold-left fold-right
125syn keyword schemeFunc remp remove remv remq memp assp cons*
126
127" ... so that a single + or -, inside a quoted context, would not be
128" interpreted as a number (outside such contexts, it's a schemeFunc)
129
130syn match	schemeDelimiter	!\.[ \t\[\]()";]!me=e-1
131syn match	schemeDelimiter	!\.$!
132" ... and a single dot is not a number but a delimiter
133
134" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
135
136syn match	schemeOther	,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*,
137syn match	schemeError	,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
138
139syn match	schemeOther	"\.\.\."
140syn match	schemeError	!\.\.\.[^ \t\[\]()";]\+!
141" ... a special identifier
142
143syn match	schemeConstant	,\*[-a-z!$%&*/:<=>?^_~0-9+.@]\+\*[ \t\[\]()";],me=e-1
144syn match	schemeConstant	,\*[-a-z!$%&*/:<=>?^_~0-9+.@]\+\*$,
145syn match	schemeError	,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
146
147syn match	schemeConstant	,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t\[\]()";],me=e-1
148syn match	schemeConstant	,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
149syn match	schemeError	,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
150
151" Non-quoted lists, and strings:
152
153syn region schemeStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
154syn region schemeStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
155
156syn region schemeStruc matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALL
157syn region schemeStruc matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALL
158
159" Simple literals:
160syn region schemeString start=+\%(\\\)\@<!"+ skip=+\\[\\"]+ end=+"+ contains=@Spell
161
162" Comments:
163
164syn match	schemeComment	";.*$" contains=@Spell
165
166
167" Writing out the complete description of Scheme numerals without
168" using variables is a day's work for a trained secretary...
169
170syn match	schemeOther	![+-][ \t\[\]()";]!me=e-1
171syn match	schemeOther	![+-]$!
172"
173" This is a useful lax approximation:
174syn match	schemeNumber	"[-#+.]\=[0-9][-#+/[email protected]]*"
175syn match	schemeError	![-#+0-9.][-#+/[email protected]]*[^-#+/[email protected] \t\[\]()";][^ \t\[\]()";]*!
176
177syn match	schemeBoolean	"#[tf]"
178syn match	schemeError	!#[tf][^ \t\[\]()";]\+!
179
180syn match	schemeCharacter	"#\\"
181syn match	schemeCharacter	"#\\."
182syn match       schemeError	!#\\.[^ \t\[\]()";]\+!
183syn match	schemeCharacter	"#\\space"
184syn match	schemeError	!#\\space[^ \t\[\]()";]\+!
185syn match	schemeCharacter	"#\\newline"
186syn match	schemeError	!#\\newline[^ \t\[\]()";]\+!
187
188" R6RS
189syn match schemeCharacter "#\\x[0-9a-fA-F]\+"
190
191
192if exists("b:is_mzscheme") || exists("is_mzscheme")
193    " MzScheme extensions
194    " multiline comment
195    syn region	schemeComment start="#|" end="|#" contains=@Spell
196
197    " #%xxx are the special MzScheme identifiers
198    syn match schemeOther "#%[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
199    " anything limited by |'s is identifier
200    syn match schemeOther "|[^|]\+|"
201
202    syn match	schemeCharacter	"#\\\%(return\|tab\)"
203
204    " Modules require stmt
205    syn keyword schemeExtSyntax module require dynamic-require lib prefix all-except prefix-all-except rename
206    " modules provide stmt
207    syn keyword schemeExtSyntax provide struct all-from all-from-except all-defined all-defined-except
208    " Other from MzScheme
209    syn keyword schemeExtSyntax with-handlers when unless instantiate define-struct case-lambda syntax-case
210    syn keyword schemeExtSyntax free-identifier=? bound-identifier=? module-identifier=? syntax-object->datum
211    syn keyword schemeExtSyntax datum->syntax-object
212    syn keyword schemeExtSyntax let-values let*-values letrec-values set!-values fluid-let parameterize begin0
213    syn keyword schemeExtSyntax error raise opt-lambda define-values unit unit/sig define-signature
214    syn keyword schemeExtSyntax invoke-unit/sig define-values/invoke-unit/sig compound-unit/sig import export
215    syn keyword schemeExtSyntax link syntax quasisyntax unsyntax with-syntax
216
217    syn keyword schemeExtFunc format system-type current-extension-compiler current-extension-linker
218    syn keyword schemeExtFunc use-standard-linker use-standard-compiler
219    syn keyword schemeExtFunc find-executable-path append-object-suffix append-extension-suffix
220    syn keyword schemeExtFunc current-library-collection-paths current-extension-compiler-flags make-parameter
221    syn keyword schemeExtFunc current-directory build-path normalize-path current-extension-linker-flags
222    syn keyword schemeExtFunc file-exists? directory-exists? delete-directory/files delete-directory delete-file
223    syn keyword schemeExtFunc system compile-file system-library-subpath getenv putenv current-standard-link-libraries
224    syn keyword schemeExtFunc remove* file-size find-files fold-files directory-list shell-execute split-path
225    syn keyword schemeExtFunc current-error-port process/ports process printf fprintf open-input-string open-output-string
226    syn keyword schemeExtFunc get-output-string
227    " exceptions
228    syn keyword schemeExtFunc exn exn:application:arity exn:application:continuation exn:application:fprintf:mismatch
229    syn keyword schemeExtFunc exn:application:mismatch exn:application:type exn:application:mismatch exn:break exn:i/o:filesystem exn:i/o:port
230    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
231    syn keyword schemeExtFunc exn:read:non-char exn:special-comment exn:syntax exn:thread exn:user exn:variable exn:application:mismatch
232    syn keyword schemeExtFunc exn? exn:application:arity? exn:application:continuation? exn:application:fprintf:mismatch? exn:application:mismatch?
233    syn keyword schemeExtFunc exn:application:type? exn:application:mismatch? exn:break? exn:i/o:filesystem? exn:i/o:port? exn:i/o:port:closed?
234    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?
235    syn keyword schemeExtFunc exn:special-comment? exn:syntax? exn:thread? exn:user? exn:variable? exn:application:mismatch?
236    " Command-line parsing
237    syn keyword schemeExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
238
239    " syntax quoting, unquoting and quasiquotation
240    syn region schemeUnquote matchgroup=Delimiter start="#," end=![ \t\[\]()";]!me=e-1 contains=ALL
241    syn region schemeUnquote matchgroup=Delimiter start="#,@" end=![ \t\[\]()";]!me=e-1 contains=ALL
242    syn region schemeUnquote matchgroup=Delimiter start="#,(" end=")" contains=ALL
243    syn region schemeUnquote matchgroup=Delimiter start="#,@(" end=")" contains=ALL
244    syn region schemeUnquote matchgroup=Delimiter start="#,\[" end="\]" contains=ALL
245    syn region schemeUnquote matchgroup=Delimiter start="#,@\[" end="\]" contains=ALL
246    syn region schemeQuoted matchgroup=Delimiter start="#['`]" end=![ \t()\[\]";]!me=e-1 contains=ALL
247    syn region schemeQuoted matchgroup=Delimiter start="#['`](" matchgroup=Delimiter end=")" contains=ALL
248
249    " Identifiers are very liberal in MzScheme/Racket
250    syn match schemeOther ![^()[\]{}",'`;#|\\ ]\+!
251
252    " Language setting
253    syn match schemeLang "#lang [-+_/A-Za-z0-9]\+\>"
254
255    " Various number forms
256    syn match schemeNumber "[-+]\=[0-9]\+\(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\>"
257    syn match schemeNumber "[-+]\=\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\>"
258    syn match schemeNumber "[-+]\=[0-9]\+/[0-9]\+\>"
259    syn match schemeNumber "\([-+]\=\([0-9]\+\(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\|\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\|[0-9]\+/[0-9]\+\)\)\=[-+]\([0-9]\+\(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\|\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\|[0-9]\+/[0-9]\+\)\=i\>"
260endif
261
262
263if exists("b:is_chicken") || exists("is_chicken")
264    " multiline comment
265    syntax region schemeMultilineComment start=/#|/ end=/|#/ contains=@Spell,schemeMultilineComment
266
267    syn match schemeOther "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
268    syn match schemeExtSyntax "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
269
270    syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec
271    syn keyword schemeExtSyntax foreign-lambda foreign-lambda* define-external define-macro load-library
272    syn keyword schemeExtSyntax let-values let*-values letrec-values ->string require-extension
273    syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable define-record
274    syn keyword schemeExtSyntax pointer tag-pointer tagged-pointer? define-foreign-type
275    syn keyword schemeExtSyntax require require-for-syntax cond-expand and-let* receive argc+argv
276    syn keyword schemeExtSyntax fixnum? fx= fx> fx< fx>= fx<= fxmin fxmax
277    syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno
278
279    " here-string
280    syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
281
282    if filereadable(expand("<sfile>:p:h")."/cpp.vim")
283	unlet! b:current_syntax
284	syn include @ChickenC <sfile>:p:h/cpp.vim
285	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC
286	syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC
287	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC
288	syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC
289	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC
290	syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC
291	syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC
292	syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC
293	syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC
294	syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC
295	syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC
296    endif
297
298    " suggested by Alex Queiroz
299    syn match schemeExtSyntax "#![-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
300    syn region schemeString start=+#<#\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
301endif
302
303" Synchronization and the wrapping up...
304
305syn sync match matchPlace grouphere NONE "^[^ \t]"
306" ... i.e. synchronize on a line that starts at the left margin
307
308" Define the default highlighting.
309" For version 5.7 and earlier: only when not done already
310" For version 5.8 and later: only when an item doesn't have highlighting yet
311if version >= 508 || !exists("did_scheme_syntax_inits")
312  if version < 508
313    let did_scheme_syntax_inits = 1
314    command -nargs=+ HiLink hi link <args>
315  else
316    command -nargs=+ HiLink hi def link <args>
317  endif
318
319  HiLink schemeSyntax		Statement
320  HiLink schemeFunc		Function
321
322  HiLink schemeString		String
323  HiLink schemeCharacter	Character
324  HiLink schemeNumber		Number
325  HiLink schemeBoolean		Boolean
326
327  HiLink schemeDelimiter	Delimiter
328  HiLink schemeConstant		Constant
329
330  HiLink schemeComment		Comment
331  HiLink schemeMultilineComment	Comment
332  HiLink schemeError		Error
333
334  HiLink schemeExtSyntax	Type
335  HiLink schemeExtFunc		PreProc
336
337  HiLink schemeLang		PreProc
338
339  delcommand HiLink
340endif
341
342let b:current_syntax = "scheme"
343
344let &cpo = s:cpo_save
345unlet s:cpo_save
346