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