xref: /vim-8.2.3635/runtime/syntax/scheme.vim (revision dfccaf0f)
1" Vim syntax file
2" Language:	Scheme (R5RS)
3" Last Change:	Nov 28, 2004
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
25syn case ignore
26
27" Fascist highlighting: everything that doesn't fit the rules is an error...
28
29syn match	schemeError	oneline    ![^ \t()\[\]";]*!
30syn match	schemeError	oneline    ")"
31
32" Quoted and backquoted stuff
33
34syn region schemeQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
35
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
42" 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
46
47syn 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
52
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
56syn 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
62" 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
113" ... 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
116syn match	schemeDelimiter	oneline    !\.[ \t\[\]()";]!me=e-1
117syn match	schemeDelimiter	oneline    !\.$!
118" ... and a single dot is not a number but a delimiter
119
120" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
121
122syn 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\[\]()";]*,
124
125syn match	schemeOther	oneline    "\.\.\."
126syn match	schemeError	oneline    !\.\.\.[^ \t\[\]()";]\+!
127" ... a special identifier
128
129syn match	schemeConstant	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[ \t\[\]()";],me=e-1
130syn match	schemeConstant	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*$,
131syn match	schemeError	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
132
133syn match	schemeConstant	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t\[\]()";],me=e-1
134syn match	schemeConstant	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
135syn match	schemeError	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
136
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
142syn 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:
146syn region schemeString start=+\%(\\\)\@<!"+ skip=+\\[\\"]+ end=+"+
147
148" Comments:
149
150syn match	schemeComment	";.*$"
151
152
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.][-#+/[email protected]]*"
161syn match	schemeError	oneline    ![-#+0-9.][-#+/[email protected]]*[^-#+/[email protected] \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
176    " multiline comment
177    syn region	schemeComment start="#|" end="|#"
178
179    " #%xxx are the special MzScheme identifiers
180    syn match schemeOther oneline    "#%[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
181    " anything limited by |'s is identifier
182    syn match schemeOther oneline    "|[^|]\+|"
183
184    syn match	schemeChar	oneline    "#\\\%(return\|tab\)"
185
186    " Modules require stmt
187    syn keyword schemeExtSyntax module require dynamic-require lib prefix all-except prefix-all-except rename
188    " modules provide stmt
189    syn keyword schemeExtSyntax provide struct all-from all-from-except all-defined all-defined-except
190    " Other from MzScheme
191    syn keyword schemeExtSyntax with-handlers when unless instantiate define-struct case-lambda syntax-case
192    syn keyword schemeExtSyntax free-identifier=? bound-identifier=? module-identifier=? syntax-object->datum
193    syn keyword schemeExtSyntax datum->syntax-object
194    syn keyword schemeExtSyntax let-values let*-values letrec-values set!-values fluid-let parameterize begin0
195    syn keyword schemeExtSyntax error raise opt-lambda define-values unit unit/sig define-signature
196    syn keyword schemeExtSyntax invoke-unit/sig define-values/invoke-unit/sig compound-unit/sig import export
197    syn keyword schemeExtSyntax link syntax quasisyntax unsyntax with-syntax
198
199    syn keyword schemeExtFunc format system-type current-extension-compiler current-extension-linker
200    syn keyword schemeExtFunc use-standard-linker use-standard-compiler
201    syn keyword schemeExtFunc find-executable-path append-object-suffix append-extension-suffix
202    syn keyword schemeExtFunc current-library-collection-paths current-extension-compiler-flags make-parameter
203    syn keyword schemeExtFunc current-directory build-path normalize-path current-extension-linker-flags
204    syn keyword schemeExtFunc file-exists? directory-exists? delete-directory/files delete-directory delete-file
205    syn keyword schemeExtFunc system compile-file system-library-subpath getenv putenv current-standard-link-libraries
206    syn keyword schemeExtFunc remove* file-size find-files fold-files directory-list shell-execute split-path
207    syn keyword schemeExtFunc current-error-port process/ports process printf fprintf open-input-string open-output-string
208    syn keyword schemeExtFunc get-output-string
209    " exceptions
210    syn keyword schemeExtFunc exn exn:application:arity exn:application:continuation exn:application:fprintf:mismatch
211    syn keyword schemeExtFunc exn:application:mismatch exn:application:type exn:application:mismatch exn:break exn:i/o:filesystem exn:i/o:port
212    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
213    syn keyword schemeExtFunc exn:read:non-char exn:special-comment exn:syntax exn:thread exn:user exn:variable exn:application:mismatch
214    syn keyword schemeExtFunc exn? exn:application:arity? exn:application:continuation? exn:application:fprintf:mismatch? exn:application:mismatch?
215    syn keyword schemeExtFunc exn:application:type? exn:application:mismatch? exn:break? exn:i/o:filesystem? exn:i/o:port? exn:i/o:port:closed?
216    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?
217    syn keyword schemeExtFunc exn:special-comment? exn:syntax? exn:thread? exn:user? exn:variable? exn:application:mismatch?
218    " Command-line parsing
219    syn keyword schemeExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
220
221    " syntax quoting, unquoting and quasiquotation
222    syn region schemeUnquote matchgroup=Delimiter start="#," end=![ \t\[\]()";]!me=e-1 contains=ALL
223    syn region schemeUnquote matchgroup=Delimiter start="#,@" end=![ \t\[\]()";]!me=e-1 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 schemeUnquote matchgroup=Delimiter start="#,@\[" end="\]" contains=ALL
228    syn region schemeQuoted matchgroup=Delimiter start="#['`]" end=![ \t()\[\]";]!me=e-1 contains=ALL
229    syn region schemeQuoted matchgroup=Delimiter start="#['`](" matchgroup=Delimiter end=")" contains=ALL
230endif
231
232
233if exists("b:is_chicken") || exists("is_chicken")
234    " multiline comment
235    syntax region schemeMultilineComment start=/#|/ end=/|#/ contains=schemeMultilineComment
236
237    syn match schemeOther oneline    "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
238    syn match schemeExtSyntax oneline    "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
239
240    syn keyword schemeExtSyntax unit uses declare hide foreign-declare foreign-parse foreign-parse/spec
241    syn keyword schemeExtSyntax foreign-lambda foreign-lambda* define-external define-macro load-library
242    syn keyword schemeExtSyntax let-values let*-values letrec-values ->string require-extension
243    syn keyword schemeExtSyntax let-optionals let-optionals* define-foreign-variable define-record
244    syn keyword schemeExtSyntax pointer tag-pointer tagged-pointer? define-foreign-type
245    syn keyword schemeExtSyntax require require-for-syntax cond-expand and-let* receive argc+argv
246    syn keyword schemeExtSyntax fixnum? fx= fx> fx< fx>= fx<= fxmin fxmax
247    syn keyword schemeExtFunc ##core#inline ##sys#error ##sys#update-errno
248
249    " here-string
250    syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+
251
252    if filereadable(expand("<sfile>:p:h")."/cpp.vim")
253	unlet! b:current_syntax
254	syn include @ChickenC <sfile>:p:h/cpp.vim
255	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-declare "+ end=+")\@=+ contains=@ChickenC
256	syn region ChickenC matchgroup=schemeComment start=+foreign-declare\s*#<<\z(.*\)$+hs=s+15 end=+^\z1$+ contains=@ChickenC
257	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse "+ end=+")\@=+ contains=@ChickenC
258	syn region ChickenC matchgroup=schemeComment start=+foreign-parse\s*#<<\z(.*\)$+hs=s+13 end=+^\z1$+ contains=@ChickenC
259	syn region ChickenC matchgroup=schemeOther start=+(\@<=foreign-parse/spec "+ end=+")\@=+ contains=@ChickenC
260	syn region ChickenC matchgroup=schemeComment start=+foreign-parse/spec\s*#<<\z(.*\)$+hs=s+18 end=+^\z1$+ contains=@ChickenC
261	syn region ChickenC matchgroup=schemeComment start=+#>+ end=+<#+ contains=@ChickenC
262	syn region ChickenC matchgroup=schemeComment start=+#>?+ end=+<#+ contains=@ChickenC
263	syn region ChickenC matchgroup=schemeComment start=+#>!+ end=+<#+ contains=@ChickenC
264	syn region ChickenC matchgroup=schemeComment start=+#>\$+ end=+<#+ contains=@ChickenC
265	syn region ChickenC matchgroup=schemeComment start=+#>%+ end=+<#+ contains=@ChickenC
266    endif
267
268endif
269
270" Synchronization and the wrapping up...
271
272syn sync match matchPlace grouphere NONE "^[^ \t]"
273" ... i.e. synchronize on a line that starts at the left margin
274
275" Define the default highlighting.
276" For version 5.7 and earlier: only when not done already
277" For version 5.8 and later: only when an item doesn't have highlighting yet
278if version >= 508 || !exists("did_scheme_syntax_inits")
279  if version < 508
280    let did_scheme_syntax_inits = 1
281    command -nargs=+ HiLink hi link <args>
282  else
283    command -nargs=+ HiLink hi def link <args>
284  endif
285
286  HiLink schemeSyntax		Statement
287  HiLink schemeFunc		Function
288
289  HiLink schemeString		String
290  HiLink schemeChar		Character
291  HiLink schemeNumber		Number
292  HiLink schemeBoolean		Boolean
293
294  HiLink schemeDelimiter	Delimiter
295  HiLink schemeConstant		Constant
296
297  HiLink schemeComment		Comment
298  HiLink schemeMultilineComment	Comment
299  HiLink schemeError		Error
300
301  HiLink schemeExtSyntax	Type
302  HiLink schemeExtFunc		PreProc
303  delcommand HiLink
304endif
305
306let b:current_syntax = "scheme"
307