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