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