xref: /vim-8.2.3635/runtime/syntax/scheme.vim (revision aedfcbe1)
1" Vim syntax file
2" Language:	Scheme (R5RS + some R6RS extras)
3" Last Change:	2012 May 13
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
248endif
249
250
251if exists("b:is_chicken") || exists("is_chicken")
252    " multiline comment
253    syntax region schemeMultilineComment start=/#|/ end=/|#/ contains=@Spell,schemeMultilineComment
254
255    syn match schemeOther "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
256    syn match schemeExtSyntax "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
257
258    syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec
259    syn keyword schemeExtSyntax foreign-lambda foreign-lambda* define-external define-macro load-library
260    syn keyword schemeExtSyntax let-values let*-values letrec-values ->string require-extension
261    syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable define-record
262    syn keyword schemeExtSyntax pointer tag-pointer tagged-pointer? define-foreign-type
263    syn keyword schemeExtSyntax require require-for-syntax cond-expand and-let* receive argc+argv
264    syn keyword schemeExtSyntax fixnum? fx= fx> fx< fx>= fx<= fxmin fxmax
265    syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno
266
267    " here-string
268    syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
269
270    if filereadable(expand("<sfile>:p:h")."/cpp.vim")
271	unlet! b:current_syntax
272	syn include @ChickenC <sfile>:p:h/cpp.vim
273	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC
274	syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC
275	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC
276	syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC
277	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC
278	syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC
279	syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC
280	syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC
281	syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC
282	syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC
283	syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC
284    endif
285
286    " suggested by Alex Queiroz
287    syn match schemeExtSyntax "#![-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
288    syn region schemeString start=+#<#\s*\z(.*\)+ end=+^\z1$+ contains=@Spell
289endif
290
291" Synchronization and the wrapping up...
292
293syn sync match matchPlace grouphere NONE "^[^ \t]"
294" ... i.e. synchronize on a line that starts at the left margin
295
296" Define the default highlighting.
297" For version 5.7 and earlier: only when not done already
298" For version 5.8 and later: only when an item doesn't have highlighting yet
299if version >= 508 || !exists("did_scheme_syntax_inits")
300  if version < 508
301    let did_scheme_syntax_inits = 1
302    command -nargs=+ HiLink hi link <args>
303  else
304    command -nargs=+ HiLink hi def link <args>
305  endif
306
307  HiLink schemeSyntax		Statement
308  HiLink schemeFunc		Function
309
310  HiLink schemeString		String
311  HiLink schemeCharacter	Character
312  HiLink schemeNumber		Number
313  HiLink schemeBoolean		Boolean
314
315  HiLink schemeDelimiter	Delimiter
316  HiLink schemeConstant		Constant
317
318  HiLink schemeComment		Comment
319  HiLink schemeMultilineComment	Comment
320  HiLink schemeError		Error
321
322  HiLink schemeExtSyntax	Type
323  HiLink schemeExtFunc		PreProc
324  delcommand HiLink
325endif
326
327let b:current_syntax = "scheme"
328
329let &cpo = s:cpo_save
330unlet s:cpo_save
331