Applied MacVim r320 patch
[MacVim.git] / runtime / syntax / scheme.vim
blob93d4187f3fdbc431fc9ee8f1cad2eccc895eba1f
1 " Vim syntax file
2 " Language:     Scheme (R5RS)
3 " Last Change:  Nov 28, 2004
4 " Maintainer:   Sergey Khorev <sergey.khorev@gmail.com>
5 " Original author:      Dirk van Deun <dirk@igwe.vub.ac.be>
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.
11 " MzScheme extensions can be activated with setting is_mzscheme variable
13 " Suggestions and bug reports are solicited by the author.
15 " Initializing:
17 " For version 5.x: Clear all syntax items
18 " For version 6.x: Quit when a syntax file was already loaded
19 if version < 600
20   syntax clear
21 elseif exists("b:current_syntax")
22   finish
23 endif
25 syn case ignore
27 " Fascist highlighting: everything that doesn't fit the rules is an error...
29 syn match       schemeError     oneline    ![^ \t()\[\]";]*!
30 syn match       schemeError     oneline    ")"
32 " Quoted and backquoted stuff
34 syn region schemeQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
36 syn region schemeQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
37 syn region schemeQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
39 syn region schemeStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
40 syn region schemeStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
42 " Popular Scheme extension:
43 " using [] as well as ()
44 syn region schemeStrucRestricted matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
45 syn region schemeStrucRestricted matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
47 syn region schemeUnquote matchgroup=Delimiter start="," end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
48 syn region schemeUnquote matchgroup=Delimiter start=",@" end=![ \t\[\]()";]!me=e-1 contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
50 syn region schemeUnquote matchgroup=Delimiter start=",(" end=")" contains=ALL
51 syn region schemeUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALL
53 syn region schemeUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
54 syn region schemeUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
56 syn region schemeUnquote matchgroup=Delimiter start=",\[" end="\]" contains=ALL
57 syn region schemeUnquote matchgroup=Delimiter start=",@\[" end="\]" contains=ALL
59 syn region schemeUnquote matchgroup=Delimiter start=",#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
60 syn region schemeUnquote matchgroup=Delimiter start=",@#\[" end="\]" contains=ALLBUT,schemeStruc,schemeSyntax,schemeFunc
62 " R5RS Scheme Functions and Syntax:
64 if version < 600
65   set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
66 else
67   setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
68 endif
70 syn keyword schemeSyntax lambda and or if cond case define let let* letrec
71 syn keyword schemeSyntax begin do delay set! else =>
72 syn keyword schemeSyntax quote quasiquote unquote unquote-splicing
73 syn keyword schemeSyntax define-syntax let-syntax letrec-syntax syntax-rules
75 syn keyword schemeFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
76 syn keyword schemeFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
77 syn keyword schemeFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
78 syn keyword schemeFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
79 syn keyword schemeFunc cddaar cddadr cdddar cddddr null? list? list length
80 syn keyword schemeFunc append reverse list-ref memq memv member assq assv assoc
81 syn keyword schemeFunc symbol? symbol->string string->symbol number? complex?
82 syn keyword schemeFunc real? rational? integer? exact? inexact? = < > <= >=
83 syn keyword schemeFunc zero? positive? negative? odd? even? max min + * - / abs
84 syn keyword schemeFunc quotient remainder modulo gcd lcm numerator denominator
85 syn keyword schemeFunc floor ceiling truncate round rationalize exp log sin cos
86 syn keyword schemeFunc tan asin acos atan sqrt expt make-rectangular make-polar
87 syn keyword schemeFunc real-part imag-part magnitude angle exact->inexact
88 syn keyword schemeFunc inexact->exact number->string string->number char=?
89 syn keyword schemeFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
90 syn keyword schemeFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
91 syn keyword schemeFunc char-numeric? char-whitespace? char-upper-case?
92 syn keyword schemeFunc char-lower-case?
93 syn keyword schemeFunc char->integer integer->char char-upcase char-downcase
94 syn keyword schemeFunc string? make-string string string-length string-ref
95 syn keyword schemeFunc string-set! string=? string-ci=? string<? string-ci<?
96 syn keyword schemeFunc string>? string-ci>? string<=? string-ci<=? string>=?
97 syn keyword schemeFunc string-ci>=? substring string-append vector? make-vector
98 syn keyword schemeFunc vector vector-length vector-ref vector-set! procedure?
99 syn keyword schemeFunc apply map for-each call-with-current-continuation
100 syn keyword schemeFunc call-with-input-file call-with-output-file input-port?
101 syn keyword schemeFunc output-port? current-input-port current-output-port
102 syn keyword schemeFunc open-input-file open-output-file close-input-port
103 syn keyword schemeFunc close-output-port eof-object? read read-char peek-char
104 syn keyword schemeFunc write display newline write-char call/cc
105 syn keyword schemeFunc list-tail string->list list->string string-copy
106 syn keyword schemeFunc string-fill! vector->list list->vector vector-fill!
107 syn keyword schemeFunc force with-input-from-file with-output-to-file
108 syn keyword schemeFunc char-ready? load transcript-on transcript-off eval
109 syn keyword schemeFunc dynamic-wind port? values call-with-values
110 syn keyword schemeFunc scheme-report-environment null-environment
111 syn keyword schemeFunc interaction-environment
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)
116 syn match       schemeDelimiter oneline    !\.[ \t\[\]()";]!me=e-1
117 syn match       schemeDelimiter oneline    !\.$!
118 " ... and a single dot is not a number but a delimiter
120 " This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
122 syn match       schemeOther     oneline    ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*,
123 syn match       schemeError     oneline    ,[a-z!$%&*/:<=>?^_~+@#%-][-a-z!$%&*/:<=>?^_~0-9+.@#%]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
125 syn match       schemeOther     oneline    "\.\.\."
126 syn match       schemeError     oneline    !\.\.\.[^ \t\[\]()";]\+!
127 " ... a special identifier
129 syn match       schemeConstant  oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[ \t\[\]()";],me=e-1
130 syn match       schemeConstant  oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*$,
131 syn match       schemeError     oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
133 syn match       schemeConstant  oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t\[\]()";],me=e-1
134 syn match       schemeConstant  oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
135 syn match       schemeError     oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t\[\]()";]\+[^ \t\[\]()";]*,
137 " Non-quoted lists, and strings:
139 syn region schemeStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
140 syn region schemeStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
142 syn region schemeStruc matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=ALL
143 syn region schemeStruc matchgroup=Delimiter start="#\[" matchgroup=Delimiter end="\]" contains=ALL
145 " Simple literals:
146 syn region schemeString start=+\%(\\\)\@<!"+ skip=+\\[\\"]+ end=+"+
148 " Comments:
150 syn match       schemeComment   ";.*$"
153 " Writing out the complete description of Scheme numerals without
154 " using variables is a day's work for a trained secretary...
156 syn match       schemeOther     oneline    ![+-][ \t\[\]()";]!me=e-1
157 syn match       schemeOther     oneline    ![+-]$!
159 " This is a useful lax approximation:
160 syn match       schemeNumber    oneline    "[-#+0-9.][-#+/0-9a-f@i.boxesfdl]*"
161 syn match       schemeError     oneline    ![-#+0-9.][-#+/0-9a-f@i.boxesfdl]*[^-#+/0-9a-f@i.boxesfdl \t\[\]()";][^ \t\[\]()";]*!
163 syn match       schemeBoolean   oneline    "#[tf]"
164 syn match       schemeError     oneline    !#[tf][^ \t\[\]()";]\+!
166 syn match       schemeChar      oneline    "#\\"
167 syn match       schemeChar      oneline    "#\\."
168 syn match       schemeError     oneline    !#\\.[^ \t\[\]()";]\+!
169 syn match       schemeChar      oneline    "#\\space"
170 syn match       schemeError     oneline    !#\\space[^ \t\[\]()";]\+!
171 syn match       schemeChar      oneline    "#\\newline"
172 syn match       schemeError     oneline    !#\\newline[^ \t\[\]()";]\+!
174 if exists("b:is_mzscheme") || exists("is_mzscheme")
175     " MzScheme extensions
176     " multiline comment
177     syn region  schemeComment start="#|" end="|#"
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    "|[^|]\+|"
184     syn match   schemeChar      oneline    "#\\\%(return\|tab\)"
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
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 
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
230 endif
233 if exists("b:is_chicken") || exists("is_chicken")
234     " multiline comment
235     syntax region schemeMultilineComment start=/#|/ end=/|#/ contains=schemeMultilineComment
237     syn match schemeOther oneline    "##[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
238     syn match schemeExtSyntax oneline    "#:[-a-z!$%&*/:<=>?^_~0-9+.@#%]\+"
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
249     " here-string
250     syn region schemeString start=+#<<\s*\z(.*\)+ end=+^\z1$+
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
268 endif
270 " Synchronization and the wrapping up...
272 syn sync match matchPlace grouphere NONE "^[^ \t]"
273 " ... i.e. synchronize on a line that starts at the left margin
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
278 if 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
286   HiLink schemeSyntax           Statement
287   HiLink schemeFunc             Function
289   HiLink schemeString           String
290   HiLink schemeChar             Character
291   HiLink schemeNumber           Number
292   HiLink schemeBoolean          Boolean
294   HiLink schemeDelimiter        Delimiter
295   HiLink schemeConstant         Constant
297   HiLink schemeComment          Comment
298   HiLink schemeMultilineComment Comment
299   HiLink schemeError            Error
301   HiLink schemeExtSyntax        Type
302   HiLink schemeExtFunc          PreProc
303   delcommand HiLink
304 endif
306 let b:current_syntax = "scheme"