changeset 29996:e37754a13778

Update runtime files Commit: https://github.com/vim/vim/commit/9b03d3e75b4274493bbe76772d7b92238791964c Author: Bram Moolenaar <Bram@vim.org> Date: Tue Aug 30 20:26:34 2022 +0100 Update runtime files
author Bram Moolenaar <Bram@vim.org>
date Tue, 30 Aug 2022 21:30:04 +0200
parents 29bc4a7d4995
children 98f5a0618a77
files .github/CODEOWNERS runtime/compiler/raco.vim runtime/compiler/racomake.vim runtime/compiler/racosetup.vim runtime/compiler/racotest.vim runtime/doc/eval.txt runtime/doc/syntax.txt runtime/doc/tags runtime/doc/todo.txt runtime/doc/vim9.txt runtime/ftplugin/gdscript.vim runtime/ftplugin/gdshader.vim runtime/ftplugin/racket.vim runtime/indent/gdscript.vim runtime/indent/racket.vim runtime/syntax/gdresource.vim runtime/syntax/gdscript.vim runtime/syntax/gdshader.vim runtime/syntax/racket.vim
diffstat 19 files changed, 1326 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -120,6 +120,8 @@ runtime/ftplugin/fpcmake.vim		@dkearns
 runtime/ftplugin/freebasic.vim		@dkearns
 runtime/ftplugin/fstab.vim		@rid9
 runtime/ftplugin/gdb.vim		@xeyownt
+runtime/ftplugin/gdscript.vim		@habamax
+runtime/ftplugin/gdshader.vim		@habamax
 runtime/ftplugin/git.vim		@tpope
 runtime/ftplugin/gitcommit.vim		@tpope
 runtime/ftplugin/gitconfig.vim		@tpope
@@ -211,6 +213,7 @@ runtime/indent/eterm.vim		@dkearns
 runtime/indent/falcon.vim		@steveno
 runtime/indent/framescript.vim		@dkearns
 runtime/indent/freebasic.vim		@dkearns
+runtime/indent/gdscript.vim		@habamax
 runtime/indent/gitconfig.vim		@tpope
 runtime/indent/gitolite.vim		@sitaramc
 runtime/indent/go.vim			@dbarnett
@@ -314,6 +317,9 @@ runtime/syntax/forth.vim		@jkotlinski
 runtime/syntax/fpcmake.vim		@dkearns
 runtime/syntax/freebasic.vim		@dkearns
 runtime/syntax/fstab.vim		@rid9
+runtime/syntax/gdresource.vim		@habamax
+runtime/syntax/gdscript.vim		@habamax
+runtime/syntax/gdshader.vim		@habamax
 runtime/syntax/git.vim			@tpope
 runtime/syntax/gitcommit.vim		@tpope
 runtime/syntax/gitconfig.vim		@tpope
@@ -326,7 +332,7 @@ runtime/syntax/groff.vim		@jmarshall
 runtime/syntax/haml.vim			@tpope
 runtime/syntax/haskell.vim		@coot
 runtime/syntax/hgcommit.vim		@k-takata
-runtime/syntax/html.vim		@dkearns
+runtime/syntax/html.vim			@dkearns
 runtime/syntax/i3config.vim		@hiqua
 runtime/syntax/icon.vim			@dkearns
 runtime/syntax/indent.vim		@dkearns
new file mode 100644
--- /dev/null
+++ b/runtime/compiler/raco.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler:     raco (Racket command-line tools)
+" Maintainer:   D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL:          https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'raco'
+
+if exists(":CompilerSet") != 2
+  command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco
+CompilerSet errorformat=%f:%l:%c:%m
new file mode 100644
--- /dev/null
+++ b/runtime/compiler/racomake.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler:     raco make (Racket command-line tools)
+" Maintainer:   D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL:          https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racomake'
+
+if exists(":CompilerSet") != 2
+  command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ make\ --\ %
+CompilerSet errorformat=%f:%l:%c:%m
new file mode 100644
--- /dev/null
+++ b/runtime/compiler/racosetup.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler:     raco setup (Racket command-line tools)
+" Maintainer:   D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL:          https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racosetup'
+
+if exists(":CompilerSet") != 2
+  command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ setup
+CompilerSet errorformat=%f:%l:%c:%m
new file mode 100644
--- /dev/null
+++ b/runtime/compiler/racotest.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler:     raco test (Racket command-line tools)
+" Maintainer:   D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL:          https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racotest'
+
+if exists(":CompilerSet") != 2
+  command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ test\ %
+CompilerSet errorformat=location:%f:%l:%c
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -3608,6 +3608,9 @@ text...
 			iterate over.  Unlike with |List|, modifying the
 			|Blob| does not affect the iteration.
 
+			When {object} is a |String| each item is a string with
+			one character, plus any combining characters.
+
 			In |Vim9| script `:endfor` cannot be shortened, to
 			improve script readability.
 
@@ -3827,7 +3830,9 @@ text...
 			Like |:echomsg| but when the messages popup window is
 			available the message is displayed there.  This means
 			it will show for three seconds and avoid a
-			|hit-enter| prompt.
+			|hit-enter| prompt.  If you want to hide it before
+			that, press Esc in Normal mode (when it would
+			otherwise beep).
 			The message window is available when Vim was compiled
 			with the +timer and the +popupwin features.
 
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -5368,7 +5368,9 @@ CursorLineFold	Like FoldColumn when 'cur
 							*hl-MatchParen*
 MatchParen	Character under the cursor or just before it, if it
 		is a paired bracket, and its match. |pi_paren.txt|
-
+							*hl-MessageWindow*
+MessageWindow	Messages popup window used when 'cmdheight' is zero.  If not
+		defined |hl-WarningMsg| is used.
 							*hl-ModeMsg*
 ModeMsg		'showmode' message (e.g., "-- INSERT --").
 							*hl-MoreMsg*
@@ -5388,6 +5390,10 @@ PmenuSel	Popup menu: Selected item.
 PmenuSbar	Popup menu: Scrollbar.
 							*hl-PmenuThumb*
 PmenuThumb	Popup menu: Thumb of the scrollbar.
+							*hl-PopupNotification*
+PopupNotification
+		Popup window created with |popup_notification()|.  If not
+		defined |hl-WarningMsg| is used.
 							*hl-Question*
 Question	|hit-enter| prompt and yes/no questions.
 							*hl-QuickFixLine*
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -2469,6 +2469,9 @@ 90.5	usr_90.txt	/*90.5*
 :echom	eval.txt	/*:echom*
 :echomsg	eval.txt	/*:echomsg*
 :echon	eval.txt	/*:echon*
+:echow	eval.txt	/*:echow*
+:echowin	eval.txt	/*:echowin*
+:echowindow	eval.txt	/*:echowindow*
 :edit	editing.txt	/*:edit*
 :edit!	editing.txt	/*:edit!*
 :edit!_f	editing.txt	/*:edit!_f*
@@ -4324,6 +4327,7 @@ E1293	textprop.txt	/*E1293*
 E1294	textprop.txt	/*E1294*
 E1295	textprop.txt	/*E1295*
 E1296	textprop.txt	/*E1296*
+E1297	vim9.txt	/*E1297*
 E13	message.txt	/*E13*
 E131	eval.txt	/*E131*
 E132	eval.txt	/*E132*
@@ -7735,6 +7739,7 @@ hl-LineNrAbove	syntax.txt	/*hl-LineNrAbo
 hl-LineNrBelow	syntax.txt	/*hl-LineNrBelow*
 hl-MatchParen	syntax.txt	/*hl-MatchParen*
 hl-Menu	syntax.txt	/*hl-Menu*
+hl-MessageWindow	syntax.txt	/*hl-MessageWindow*
 hl-ModeMsg	syntax.txt	/*hl-ModeMsg*
 hl-MoreMsg	syntax.txt	/*hl-MoreMsg*
 hl-NonText	syntax.txt	/*hl-NonText*
@@ -7743,6 +7748,7 @@ hl-Pmenu	syntax.txt	/*hl-Pmenu*
 hl-PmenuSbar	syntax.txt	/*hl-PmenuSbar*
 hl-PmenuSel	syntax.txt	/*hl-PmenuSel*
 hl-PmenuThumb	syntax.txt	/*hl-PmenuThumb*
+hl-PopupNotification	syntax.txt	/*hl-PopupNotification*
 hl-Question	syntax.txt	/*hl-Question*
 hl-QuickFixLine	syntax.txt	/*hl-QuickFixLine*
 hl-Scrollbar	syntax.txt	/*hl-Scrollbar*
@@ -9432,6 +9438,7 @@ setbufvar()	builtin.txt	/*setbufvar()*
 setcellwidths()	builtin.txt	/*setcellwidths()*
 setcharpos()	builtin.txt	/*setcharpos()*
 setcharsearch()	builtin.txt	/*setcharsearch()*
+setcmdline()	builtin.txt	/*setcmdline()*
 setcmdpos()	builtin.txt	/*setcmdpos()*
 setcursorcharpos()	builtin.txt	/*setcursorcharpos()*
 setenv()	builtin.txt	/*setenv()*
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -38,8 +38,13 @@ browser use: https://github.com/vim/vim/
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+cmdheight=0:
+- :g/pattern should not use message window  #11012
+
 *.sil detection with FTsil() (lacygoill, Aug 25)
 
+Avoid using "Xfile" and "Xdir" in tests, use specific names.
+
 Further Vim9 improvements, possibly after launch:
 - Use Vim9 for more runtime files.
 - Check performance with callgrind and kcachegrind.
@@ -178,19 +183,10 @@ Terminal emulator window:
 - When 'encoding' is not utf-8, or the job is using another encoding, setup
   conversions.
 
-Patches considered for including:
-- use int instead of char_ for index  #10818  needs a test
-- Add "-n" option to xxd. #10599  needs a test
-- allow for nesting of timeout, sketch in #10595
-- Add setcmdline()  #10869
-
 Cleanup:
-- Remove OLD_DIGRAPHS ?
 - Remove FEAT_FOOTER ?
 
-Add 'splitscroll'  #10682  Useful?  Any trouble? Null Chilly says it's OK.
-    suggestion: names instead of numbers for the option value
-    problem depending on whether window is focused or not
+Add 'splitscroll'  #10682  Useful?  Any remaining trouble?
 
 Autoconf: must use autoconf 2.69, later version generates lots of warnings
 - try using autoconf 2.71 and fix all "obsolete" warnings
@@ -882,9 +878,6 @@ The ++ options for the :edit command are
 Overlong utf-8 sequence is displayed wrong. (Harm te Hennepe, 2017 Sep 14,
 #2089)  Patch with possible solution by Björn Linse.
 
-The change list index is local to a buffer, but it doesn't make sense using it
-for another buffer.  (lacygoill) Copy w_changelistidx to wininfo_S and back.
-
 X11: Putting more than about 262040 characters of text on the clipboard and
 pasting it in another Vim doesn't work.  (Dominique Pelle, 2008 Aug 21-23)
 clip_x11_request_selection_cb() is called with zero value and length.
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -1618,7 +1618,7 @@ type, it can not be used in Vim9 script.
 			 *E1211* *E1217* *E1218* *E1219* *E1220* *E1221*
 			 *E1222* *E1223* *E1224* *E1225* *E1226* *E1227*
 			 *E1228* *E1238* *E1250* *E1251* *E1252* *E1253*
-			 *E1256*
+			 *E1256* *E1297*
 Types are checked for most builtin functions to make it easier to spot
 mistakes.
 
new file mode 100644
--- /dev/null
+++ b/runtime/ftplugin/gdscript.vim
@@ -0,0 +1,53 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: gdscript (Godot game engine scripting language)
+# Maintainer: Maxim Kim <habamax@gmail.com>
+
+if exists("b:did_ftplugin") | finish | endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = 'setlocal cinkeys<'
+      \ .. '| setlocal indentkeys<'
+      \ .. '| setlocal commentstring<'
+      \ .. '| setlocal suffixesadd<'
+      \ .. '| setlocal foldexpr<'
+      \ .. '| setlocal foldignore<'
+
+setlocal cinkeys-=0#
+setlocal indentkeys-=0#
+setlocal suffixesadd=.gd
+setlocal commentstring=#\ %s
+setlocal foldignore=
+setlocal foldexpr=GDScriptFoldLevel()
+
+
+def GDScriptFoldLevel(): string
+    var line = getline(v:lnum)
+    if line =~? '^\s*$'
+        return "-1"
+    endif
+
+    var sw = shiftwidth()
+    var indent = indent(v:lnum) / sw
+    var indent_next = indent(nextnonblank(v:lnum + 1)) / sw
+
+    if indent_next > indent && line =~ ':\s*$'
+        return $">{indent_next}"
+    else
+        return $"{indent}"
+    endif
+enddef
+
+
+# Next/Previous section
+def NextSection(back: bool, cnt: number)
+    for n in range(cnt)
+        search('^\s*func\s', back ? 'bW' : 'W')
+    endfor
+enddef
+
+nnoremap <silent><buffer>   ]] <scriptcmd>NextSection(false, v:count1)<CR>
+nnoremap <silent><buffer>   [[ <scriptcmd>NextSection(true, v:count1)<CR>
+xmap <silent><buffer><expr> ]] "\<esc>" .. v:count1 .. ']]m>gv'
+xmap <silent><buffer><expr> [[ "\<esc>" .. v:count1 .. '[[m>gv'
new file mode 100644
--- /dev/null
+++ b/runtime/ftplugin/gdshader.vim
@@ -0,0 +1,12 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: Godot shading language
+# Maintainer: Maxim Kim <habamax@gmail.com>
+
+if exists("b:did_ftplugin") | finish | endif
+b:did_ftplugin = 1
+
+b:undo_ftplugin = 'setlocal suffixesadd<'
+
+setlocal suffixesadd=.gdshader
new file mode 100644
--- /dev/null
+++ b/runtime/ftplugin/racket.vim
@@ -0,0 +1,82 @@
+" Vim filetype plugin
+" Language:             Racket
+" Maintainer:           D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer:  Will Langstroth <will@langstroth.com>
+" URL:                  https://github.com/benknoble/vim-racket
+" Last Change:          2022 Aug 29
+
+if exists("b:did_ftplugin")
+  finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" quick hack to allow adding values
+setlocal iskeyword=@,!,#-',*-:,<-Z,a-z,~,_,94
+
+" Enable auto begin new comment line when continuing from an old comment line
+setlocal comments=:;;;;,:;;;,:;;,:;
+setlocal formatoptions+=r
+
+"setlocal commentstring=;;%s
+setlocal commentstring=#\|\ %s\ \|#
+
+setlocal formatprg=raco\ fmt
+
+" Undo our settings when the filetype changes away from Racket
+" (this should be amended if settings/mappings are added above!)
+let b:undo_ftplugin =
+      \  "setlocal iskeyword< lispwords< lisp< comments< formatoptions< formatprg<"
+      \. " | setlocal commentstring<"
+
+if !exists("no_plugin_maps") && !exists("no_racket_maps")
+  " Simply setting keywordprg like this works:
+  "    setlocal keywordprg=raco\ docs
+  " but then vim says:
+  "    "press ENTER or type a command to continue"
+  " We avoid the annoyance of having to hit enter by remapping K directly.
+  function s:RacketDoc(word) abort
+    execute 'silent !raco docs --' shellescape(a:word)
+    redraw!
+  endfunction
+  nnoremap <buffer> <Plug>RacketDoc :call <SID>RacketDoc(expand('<cword>'))<CR>
+  nmap <buffer> K <Plug>RacketDoc
+
+  " For the visual mode K mapping, it's slightly more convoluted to get the
+  " selected text:
+  function! s:Racket_visual_doc()
+    try
+      let l:old_a = @a
+      normal! gv"ay
+      call system("raco docs '". @a . "'")
+      redraw!
+      return @a
+    finally
+      let @a = l:old_a
+    endtry
+  endfunction
+
+  xnoremap <buffer> <Plug>RacketDoc :call <SID>Racket_visual_doc()<cr>
+  xmap <buffer> K <Plug>RacketDoc
+
+  let b:undo_ftplugin .=
+      \  " | silent! execute 'nunmap <buffer> K'"
+      \. " | silent! execute 'xunmap <buffer> K'"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+  let b:browsefilter =
+        \  "Racket Source Files (*.rkt *.rktl)\t*.rkt;*.rktl\n"
+        \. "All Files (*.*)\t*.*\n"
+  let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+  let b:match_words = '#|:|#'
+  let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
new file mode 100644
--- /dev/null
+++ b/runtime/indent/gdscript.vim
@@ -0,0 +1,148 @@
+vim9script
+
+# Vim indent file
+# Language: gdscript (Godot game engine)
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Based on python indent file.
+
+if exists("b:did_indent")
+    finish
+endif
+b:did_indent = 1
+
+var undo_opts = "setl indentexpr< indentkeys< lisp< autoindent<"
+
+if exists('b:undo_indent')
+    b:undo_indent ..= "|" .. undo_opts
+else
+    b:undo_indent = undo_opts
+endif
+
+setlocal nolisp
+setlocal autoindent
+setlocal indentexpr=GDScriptIndent()
+setlocal indentkeys+=<:>,=elif,=except
+
+
+def GDScriptIndent(): number
+    # If this line is explicitly joined: If the previous line was also joined,
+    # line it up with that one, otherwise add two 'shiftwidth'
+    if getline(v:lnum - 1) =~ '\\$'
+        if v:lnum > 1 && getline(v:lnum - 2) =~ '\\$'
+            return indent(v:lnum - 1)
+        endif
+        return indent(v:lnum - 1) + (shiftwidth() * 2)
+    endif
+
+    # If the start of the line is in a string don't change the indent.
+    if has('syntax_items') && synIDattr(synID(v:lnum, 1, 1), "name") =~ "String$"
+        return -1
+    endif
+
+    # Search backwards for the previous non-empty line.
+    var plnum = prevnonblank(v:lnum - 1)
+
+    if plnum == 0
+        # This is the first non-empty line, use zero indent.
+        return 0
+    endif
+
+    var plindent = indent(plnum)
+    var plnumstart = plnum
+
+    # Get the line and remove a trailing comment.
+    # Use syntax highlighting attributes when possible.
+    var pline = getline(plnum)
+    var pline_len = strlen(pline)
+    if has('syntax_items')
+        # If the last character in the line is a comment, do a binary search for
+        # the start of the comment.  synID() is slow, a linear search would take
+        # too long on a long line.
+        if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+            var min = 1
+            var max = pline_len
+            while min < max
+                var col = (min + max) / 2
+                if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+                    max = col
+                else
+                    min = col + 1
+                endif
+            endwhile
+            pline = strpart(pline, 0, min - 1)
+        endif
+    else
+        var col = 0
+        while col < pline_len
+            if pline[col] == '#'
+                pline = strpart(pline, 0, col)
+                break
+            endif
+            col = col + 1
+        endwhile
+    endif
+
+
+    # When "inside" parenthesis: If at the first line below the parenthesis add
+    # one 'shiftwidth' ("inside" is simplified and not really checked)
+    # my_var = (
+    #     a
+    #     + b
+    #     + c
+    # )
+    if pline =~ '[({\[]\s*$'
+        return indent(plnum) + shiftwidth()
+    endif
+
+
+    # If the previous line ended with a colon, indent this line
+    if pline =~ ':\s*$'
+        return plindent + shiftwidth()
+    endif
+
+    # If the previous line was a stop-execution statement...
+    if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+        # See if the user has already dedented
+        if indent(v:lnum) > indent(plnum) - shiftwidth()
+            # If not, recommend one dedent
+            return indent(plnum) - shiftwidth()
+        endif
+        # Otherwise, trust the user
+        return -1
+    endif
+
+    # If the current line begins with a keyword that lines up with "try"
+    if getline(v:lnum) =~ '^\s*\(except\|finally\)\>'
+        var lnum = v:lnum - 1
+        while lnum >= 1
+            if getline(lnum) =~ '^\s*\(try\|except\)\>'
+                var ind = indent(lnum)
+                if ind >= indent(v:lnum)
+                    return -1   # indent is already less than this
+                endif
+                return ind      # line up with previous try or except
+            endif
+            lnum = lnum - 1
+        endwhile
+        return -1               # no matching "try"!
+    endif
+
+
+    # If the current line begins with a header keyword, dedent
+    if getline(v:lnum) =~ '^\s*\(elif\|else\)\>'
+
+        # Unless the previous line was a one-liner
+        if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>'
+            return plindent
+        endif
+
+        # Or the user has already dedented
+        if indent(v:lnum) <= plindent - shiftwidth()
+            return -1
+        endif
+
+        return plindent - shiftwidth()
+    endif
+
+    return -1
+enddef
new file mode 100644
--- /dev/null
+++ b/runtime/indent/racket.vim
@@ -0,0 +1,60 @@
+" Vim indent file
+" Language:             Racket
+" Maintainer:           D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer:  Will Langstroth <will@langstroth.com>
+" URL:                  https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+if exists("b:did_indent")
+   finish
+endif
+let b:did_indent = 1
+
+setlocal lisp autoindent nosmartindent
+
+setlocal lispwords+=module,module*,module+,parameterize,let-values,let*-values,letrec-values,local
+setlocal lispwords+=define/contract
+setlocal lispwords+=λ
+setlocal lispwords+=with-handlers
+setlocal lispwords+=define-values,opt-lambda,case-lambda,syntax-rules,with-syntax,syntax-case,syntax-parse
+setlocal lispwords+=define-for-syntax,define-syntax-parser,define-syntax-parse-rule,define-syntax-class,define-splicing-syntax-class
+setlocal lispwords+=define-signature,unit,unit/sig,compund-unit/sig,define-values/invoke-unit/sig
+setlocal lispwords+=define-opt/c,define-syntax-rule
+setlocal lispwords+=define-test-suite
+setlocal lispwords+=struct
+setlocal lispwords+=with-input-from-file,with-output-to-file
+
+" Racket OOP
+" TODO missing a lot of define-like forms here (e.g., define/augment, etc.)
+setlocal lispwords+=class,class*,mixin,interface,class/derived
+setlocal lispwords+=define/public,define/pubment,define/public-final
+setlocal lispwords+=define/override,define/overment,define/override-final
+setlocal lispwords+=define/augment,define/augride,define/augment-final
+setlocal lispwords+=define/private
+
+" kanren
+setlocal lispwords+=fresh,run,run*,project,conde,condu
+
+" loops
+setlocal lispwords+=for,for/list,for/fold,for*,for*/list,for*/fold,for/or,for/and,for*/or,for*/and
+setlocal lispwords+=for/hash,for/hasheq,for/hasheqv,for/sum,for/flvector,for*/flvector,for/vector,for*/vector,for*/sum,for*/hash,for*/hasheq,for*/hasheqv
+setlocal lispwords+=for/async
+setlocal lispwords+=for/set,for*/set
+setlocal lispwords+=for/first,for*/first
+
+setlocal lispwords+=match,match*,match/values,define/match,match-lambda,match-lambda*,match-lambda**
+setlocal lispwords+=match-let,match-let*,match-let-values,match-let*-values
+setlocal lispwords+=match-letrec,match-define,match-define-values
+
+setlocal lispwords+=let/cc,let/ec
+
+" qi
+setlocal lispwords+=define-flow,define-switch,flow-lambda,switch-lambda,on,switch,π,λ01
+setlocal lispwords+=define-qi-syntax,define-qi-syntax-parser,define-qi-syntax-rule
+
+" gui-easy
+setlocal lispwords+=if-view,case-view,cond-view,list-view,dyn-view
+setlocal lispwords+=case/dep
+setlocal lispwords+=define/obs
+
+let b:undo_indent = "setlocal lisp< ai< si< lw<"
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/gdresource.vim
@@ -0,0 +1,64 @@
+" Vim syntax file for Godot resource (scenes)
+" Language:     gdresource
+" Maintainer:   Maxim Kim <habamax@gmail.com>
+" Filenames:    *.tscn, *.tres
+
+if exists("b:current_syntax")
+    finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn match gdResourceNumber "\<0x\%(_\=\x\)\+\>"
+syn match gdResourceNumber "\<0b\%(_\=[01]\)\+\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\.\%(e[+-]\=\d\%(_\=\d\)*\)\=\%(\W\|$\)\@="
+syn match gdResourceNumber "\%(^\|\W\)\@1<=\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+
+syn keyword gdResourceKeyword true false
+
+syn region gdResourceString
+      \ start=+[uU]\="+ end='"' skip='\\\\\|\\"'
+      \ contains=@Spell keepend
+
+" Section
+syn region gdResourceSection matchgroup=gdResourceSectionDelimiter
+      \ start='^\[' end=']\s*$'
+      \ oneline keepend
+      \ contains=gdResourceSectionName,gdResourceSectionAttribute
+
+syn match gdResourceSectionName '\[\@<=\S\+' contained skipwhite
+syn match gdResourceSectionAttribute '\S\+\s*=\s*\S\+'
+      \ skipwhite keepend contained
+      \ contains=gdResourceSectionAttributeName,gdResourceSectionAttributeValue
+syn match gdResourceSectionAttributeName '\S\+\ze\(\s*=\)' skipwhite contained
+syn match gdResourceSectionAttributeValue '\(=\s*\)\zs\S\+\ze' skipwhite
+      \ contained
+      \ contains=gdResourceString,gdResourceNumber,gdResourceKeyword
+
+
+" Section body
+syn match gdResourceAttribute '^\s*\S\+\s*=.*$'
+      \ skipwhite keepend
+      \ contains=gdResourceAttributeName,gdResourceAttributeValue
+
+syn match gdResourceAttributeName '\S\+\ze\(\s*=\)' skipwhite contained
+syn match gdResourceAttributeValue '\(=\s*\)\zs.*$' skipwhite
+      \ contained
+      \ contains=gdResourceString,gdResourceNumber,gdResourceKeyword
+
+
+hi def link gdResourceNumber Constant
+hi def link gdResourceKeyword Constant
+hi def link gdResourceSectionName Statement
+hi def link gdResourceSectionDelimiter Delimiter
+hi def link gdResourceSectionAttributeName Type
+hi def link gdResourceAttributeName Identifier
+hi def link gdResourceString String
+
+let b:current_syntax = "gdresource"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/gdscript.vim
@@ -0,0 +1,104 @@
+" Vim syntax file for Godot gdscript
+" Language:     gdscript
+" Maintainer:   Maxim Kim <habamax@gmail.com>
+" Filenames:    *.gd
+
+if exists("b:current_syntax")
+    finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+syntax sync maxlines=100
+
+syn keyword gdscriptConditional if else elif match
+syn keyword gdscriptRepeat for while break continue
+
+syn keyword gdscriptOperator is as not and or in
+
+syn match gdscriptClass "\v<\u\w+>"
+syn match gdscriptConstant "\<[_A-Z]\+[0-9_A-Z]*\>"
+syn match gdscriptBlockStart ":\s*$"
+
+syn keyword gdscriptKeyword null self owner parent tool
+syn keyword gdscriptBoolean false true
+
+syn keyword gdscriptStatement remote master puppet remotesync mastersync puppetsync sync
+syn keyword gdscriptStatement return pass
+syn keyword gdscriptStatement static const enum
+syn keyword gdscriptStatement breakpoint assert
+syn keyword gdscriptStatement onready
+syn keyword gdscriptStatement class_name extends
+
+syn keyword gdscriptType void bool int float String contained
+
+syn keyword gdscriptStatement var nextgroup=gdscriptTypeDecl skipwhite
+syn keyword gdscriptStatement const nextgroup=gdscriptTypeDecl skipwhite
+syn match gdscriptTypeDecl "\h\w*\s*:\s*\h\w*" contains=gdscriptOperator,gdscriptType,gdscriptClass contained skipwhite
+syn match gdscriptTypeDecl "->\s*\h\w*" contains=gdscriptOperator,gdscriptType,gdscriptClass skipwhite
+
+syn keyword gdscriptStatement export nextgroup=gdscriptExportTypeDecl skipwhite
+syn match gdscriptExportTypeDecl "(.\{-}[,)]" contains=gdscriptOperator,gdscriptType,gdscriptClass contained skipwhite
+
+syn keyword gdscriptStatement setget nextgroup=gdscriptSetGet,gdscriptSetGetSeparator skipwhite
+syn match gdscriptSetGet "\h\w*" nextgroup=gdscriptSetGetSeparator display contained skipwhite
+syn match gdscriptSetGetSeparator "," nextgroup=gdscriptSetGet display contained skipwhite
+
+syn keyword gdscriptStatement class func signal nextgroup=gdscriptFunctionName skipwhite
+syn match gdscriptFunctionName "\h\w*" nextgroup=gdscriptFunctionParams display contained skipwhite
+syn match gdscriptFunctionParams "(.*)" contains=gdscriptTypeDecl display contained skipwhite
+
+syn match gdscriptNode "\$\h\w*\%(/\h\w*\)*"
+
+syn match gdscriptComment "#.*$" contains=@Spell,gdscriptTodo
+
+syn region gdscriptString matchgroup=gdscriptQuotes
+      \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+      \ contains=gdscriptEscape,@Spell
+
+syn region gdscriptString matchgroup=gdscriptTripleQuotes
+      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
+      \ contains=gdscriptEscape,@Spell
+
+syn match gdscriptEscape +\\[abfnrtv'"\\]+ contained
+syn match gdscriptEscape "\\$"
+
+" Numbers
+syn match gdscriptNumber "\<0x\%(_\=\x\)\+\>"
+syn match gdscriptNumber "\<0b\%(_\=[01]\)\+\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\.\%(e[+-]\=\d\%(_\=\d\)*\)\=\%(\W\|$\)\@="
+syn match gdscriptNumber "\%(^\|\W\)\@1<=\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+
+" XXX, TODO, etc
+syn keyword gdscriptTodo TODO XXX FIXME HACK NOTE BUG contained
+
+hi def link gdscriptStatement Statement
+hi def link gdscriptKeyword Keyword
+hi def link gdscriptConditional Conditional
+hi def link gdscriptBoolean Boolean
+hi def link gdscriptOperator Operator
+hi def link gdscriptRepeat Repeat
+hi def link gdscriptSetGet Function
+hi def link gdscriptFunctionName Function
+hi def link gdscriptClass Type
+hi def link gdscriptConstant Constant
+hi def link gdscriptBuiltinStruct Typedef
+hi def link gdscriptComment Comment
+hi def link gdscriptString String
+hi def link gdscriptQuotes String
+hi def link gdscriptTripleQuotes String
+hi def link gdscriptEscape Special
+hi def link gdscriptNode PreProc
+hi def link gdscriptType Type
+hi def link gdscriptNumber Number
+hi def link gdscriptBlockStart Special
+hi def link gdscriptTodo Todo
+
+
+let b:current_syntax = "gdscript"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/gdshader.vim
@@ -0,0 +1,57 @@
+" Vim syntax file for Godot shading language
+" Language:     gdshader
+" Maintainer:   Maxim Kim <habamax@gmail.com>
+" Filenames:    *.gdshader
+
+if exists("b:current_syntax")
+    finish
+endif
+
+syn keyword gdshaderConditional if else switch case default
+syn keyword gdshaderRepeat for while do
+syn keyword gdshaderStatement return discard
+syn keyword gdshaderBoolean true false
+
+syn keyword gdshaderKeyword shader_type render_mode
+syn keyword gdshaderKeyword in out inout
+syn keyword gdshaderKeyword lowp mediump highp
+syn keyword gdshaderKeyword uniform varying const
+syn keyword gdshaderKeyword flat smooth
+
+syn keyword gdshaderType float vec2 vec3 vec4
+syn keyword gdshaderType uint uvec2 uvec3 uvec4
+syn keyword gdshaderType int ivec2 ivec3 ivec4
+syn keyword gdshaderType void bool
+syn keyword gdshaderType bvec2 bvec3 bvec4
+syn keyword gdshaderType mat2 mat3 mat4
+syn keyword gdshaderType sampler2D isampler2D usampler2D samplerCube
+
+syn match gdshaderMember "\v<(\.)@<=[a-z_]+\w*>"
+syn match gdshaderBuiltin "\v<[A-Z_]+[A-Z0-9_]*>"
+syn match gdshaderFunction "\v<\w*>(\()@="
+
+syn match gdshaderNumber "\v<\d+(\.)@!>"
+syn match gdshaderFloat "\v<\d*\.\d+(\.)@!>"
+syn match gdshaderFloat "\v<\d*\.=\d+(e-=\d+)@="
+syn match gdshaderExponent "\v(\d*\.=\d+)@<=e-=\d+>"
+
+syn match gdshaderComment "\v//.*$" contains=@Spell
+syn region gdshaderComment start="/\*" end="\*/" contains=@Spell
+syn keyword gdshaderTodo TODO FIXME XXX NOTE BUG HACK OPTIMIZE containedin=gdshaderComment
+
+hi def link gdshaderConditional Conditional
+hi def link gdshaderRepeat Repeat
+hi def link gdshaderStatement Statement
+hi def link gdshaderBoolean Boolean
+hi def link gdshaderKeyword Keyword
+hi def link gdshaderMember Identifier
+hi def link gdshaderBuiltin Identifier
+hi def link gdshaderFunction Function
+hi def link gdshaderType Type
+hi def link gdshaderNumber Number
+hi def link gdshaderFloat Float
+hi def link gdshaderExponent Special
+hi def link gdshaderComment Comment
+hi def link gdshaderTodo Todo
+
+let b:current_syntax = "gdshader"
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/racket.vim
@@ -0,0 +1,656 @@
+" Vim syntax file
+" Language:             Racket
+" Maintainer:           D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer:  Will Langstroth <will@langstroth.com>
+" URL:                  https://github.com/benknoble/vim-racket
+" Description:          Contains all of the keywords in #lang racket
+" Last Change: 2022 Aug 12
+
+" Initializing:
+if exists("b:current_syntax")
+  finish
+endif
+
+" Highlight unmatched parens
+syntax match racketError ,[]})],
+
+if version < 800
+  set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
+else
+  " syntax iskeyword 33,35-39,42-58,60-90,94,95,97-122,126,_
+  " converted from decimal to char
+  " :s/\d\+/\=submatch(0)->str2nr()->nr2char()/g
+  " but corrected to remove duplicate _, move ^ to end
+  syntax iskeyword @,!,#-',*-:,<-Z,a-z,~,_,^
+  " expanded
+  " syntax iskeyword !,#,$,%,&,',*,+,,,-,.,/,0-9,:,<,=,>,?,@,A-Z,_,a-z,~,^
+endif
+
+" Forms in order of appearance at
+" http://docs.racket-lang.org/reference/index.html
+"
+syntax keyword racketSyntax module module* module+ require provide quote
+syntax keyword racketSyntax #%datum #%expression #%top #%variable-reference #%app
+syntax keyword racketSyntax lambda case-lambda let let* letrec
+syntax keyword racketSyntax let-values let*-values let-syntax letrec-syntax
+syntax keyword racketSyntax let-syntaxes letrec-syntaxes letrec-syntaxes+values
+syntax keyword racketSyntax local shared
+syntax keyword racketSyntax if cond and or case define else =>
+syntax keyword racketSyntax define define-values define-syntax define-syntaxes
+syntax keyword racketSyntax define-for-syntax define-require-syntax define-provide-syntax
+syntax keyword racketSyntax define-syntax-rule
+syntax keyword racketSyntax define-record-type
+syntax keyword racketSyntax begin begin0
+syntax keyword racketSyntax begin-for-syntax
+syntax keyword racketSyntax when unless
+syntax keyword racketSyntax set! set!-values
+syntax keyword racketSyntax for for/list for/vector for/hash for/hasheq for/hasheqv
+syntax keyword racketSyntax for/and for/or for/lists for/first
+syntax keyword racketSyntax for/last for/fold
+syntax keyword racketSyntax for* for*/list for*/vector for*/hash for*/hasheq for*/hasheqv
+syntax keyword racketSyntax for*/and for*/or for*/lists for*/first
+syntax keyword racketSyntax for*/last for*/fold
+syntax keyword racketSyntax for/fold/derived for*/fold/derived
+syntax keyword racketSyntax define-sequence-syntax :do-in do
+syntax keyword racketSyntax with-continuation-mark
+syntax keyword racketSyntax quasiquote unquote unquote-splicing quote-syntax
+syntax keyword racketSyntax #%top-interaction
+syntax keyword racketSyntax define-package open-package package-begin
+syntax keyword racketSyntax define* define*-values define*-syntax define*-syntaxes open*-package
+syntax keyword racketSyntax package? package-exported-identifiers package-original-identifiers
+syntax keyword racketSyntax block #%stratified-body
+
+" 8 Contracts
+" 8.2 Function contracts
+syntax keyword racketSyntax -> ->* ->i ->d case-> dynamic->* unconstrained-domain->
+
+" 8.6.1 Nested Contract Boundaries
+syntax keyword racketSyntax with-contract define/contract define-struct/contract
+syntax keyword racketSyntax invariant-assertion current-contract-region
+
+" 9 Pattern Matching
+syntax keyword racketSyntax match match* match/values define/match
+syntax keyword racketSyntax match-lambda match-lambda* match-lambda**
+syntax keyword racketSyntax match-let match-let* match-let-values match-let*-values
+syntax keyword racketSyntax match-letrec match-define match-define-values
+
+" 10.2.3 Handling Exceptions
+syntax keyword racketSyntax with-handlers with-handlers*
+
+" 10.4 Continuations
+syntax keyword racketSyntax let/cc let/ec
+
+" 10.4.1 Additional Control Operators
+syntax keyword racketSyntax % prompt control prompt-at control-at reset shift
+syntax keyword racketSyntax reset-at shift-at prompt0 reset0 control0 shift0
+syntax keyword racketSyntax prompt0-at reset0-at control0-at shift0-at
+syntax keyword racketSyntax set cupto
+
+" 11.3.2 Parameters
+syntax keyword racketSyntax parameterize parameterize*
+
+" 12.5 Writing
+syntax keyword racketSyntax write display displayln print
+syntax keyword racketSyntax fprintf printf eprintf format
+syntax keyword racketSyntax print-pair-curly-braces print-mpair-curly-braces print-unreadable
+syntax keyword racketSyntax print-graph print-struct print-box print-vector-length print-hash-table
+syntax keyword racketSyntax print-boolean-long-form print-reader-abbreviations print-as-expression print-syntax-width
+syntax keyword racketSyntax current-write-relative-directory port-write-handler port-display-handler
+syntax keyword racketSyntax port-print-handler global-port-print-handler
+
+" 13.7 Custodians
+syntax keyword racketSyntax custodian? custodian-memory-accounting-available? custodian-box?
+syntax keyword racketSyntax make-custodian custodian-shutdown-all current-custodian custodian-managed-list
+syntax keyword racketSyntax custodian-require-memory custodian-limit-memory
+syntax keyword racketSyntax make-custodian-box custodian-box-value
+
+" lambda sign
+syntax match racketSyntax /\<[\u03bb]\>/
+
+
+" Functions ==================================================================
+
+syntax keyword racketFunc boolean? not equal? eqv? eq? equal?/recur immutable?
+syntax keyword racketFunc true false symbol=? boolean=? false?
+syntax keyword racketFunc number? complex? real? rational? integer?
+syntax keyword racketFunc exact-integer? exact-nonnegative-integer?
+syntax keyword racketFunc exact-positive-integer? inexact-real?
+syntax keyword racketFunc fixnum? flonum? zero? positive? negative?
+syntax keyword racketFunc even? odd? exact? inexact?
+syntax keyword racketFunc inexact->exact exact->inexact
+
+" 3.2.2 General Arithmetic
+
+" 3.2.2.1 Arithmetic
+syntax keyword racketFunc + - * / quotient remainder quotient/remainder modulo
+syntax keyword racketFunc add1 sub1 abs max min gcd lcm round exact-round floor
+syntax keyword racketFunc ceiling truncate numerator denominator rationalize
+
+" 3.2.2.2 Number Comparison
+syntax keyword racketFunc = < <= > >=
+
+" 3.2.2.3 Powers and Roots
+syntax keyword racketFunc sqrt integer-sqrt integer-sqrt/remainder
+syntax keyword racketFunc expt exp log
+
+" 3.2.2.3 Trigonometric Functions
+syntax keyword racketFunc sin cos tan asin acos atan
+
+" 3.2.2.4 Complex Numbers
+syntax keyword racketFunc make-rectangular make-polar
+syntax keyword racketFunc real-part imag-part magnitude angle
+syntax keyword racketFunc bitwise-ior bitwise-and bitwise-xor bitwise-not
+syntax keyword racketFunc bitwise-bit-set? bitwise-bit-field arithmetic-shift
+syntax keyword racketFunc integer-length
+
+" 3.2.2.5 Random Numbers
+syntax keyword racketFunc random random-seed
+syntax keyword racketFunc make-pseudo-random-generator pseudo-random-generator?
+syntax keyword racketFunc current-pseudo-random-generator pseudo-random-generator->vector
+syntax keyword racketFunc vector->pseudo-random-generator vector->pseudo-random-generator!
+
+" 3.2.2.8 Number-String Conversions
+syntax keyword racketFunc number->string string->number real->decimal-string
+syntax keyword racketFunc integer->integer-bytes
+syntax keyword racketFunc floating-point-bytes->real real->floating-point-bytes
+syntax keyword racketFunc system-big-endian?
+
+" 3.2.2.9 Extra Constants and Functions
+syntax keyword racketFunc pi sqr sgn conjugate sinh cosh tanh order-of-magnitude
+
+" 3.2.3 Flonums
+
+" 3.2.3.1 Flonum Arithmetic
+syntax keyword racketFunc fl+ fl- fl* fl/ flabs
+syntax keyword racketFunc fl= fl< fl> fl<= fl>= flmin flmax
+syntax keyword racketFunc flround flfloor flceiling fltruncate
+syntax keyword racketFunc flsin flcos fltan flasin flacos flatan
+syntax keyword racketFunc fllog flexp flsqrt
+syntax keyword racketFunc ->fl fl->exact-integer make-flrectangular
+syntax keyword racketFunc flreal-part flimag-part
+
+" 3.2.3.2 Flonum Vectors
+syntax keyword racketFunc flvector? flvector make-flvector flvector-length
+syntax keyword racketFunc flvector-ref flvector-set! flvector-copy in-flvector
+syntax keyword racketFunc shared-flvector make-shared-flvector
+syntax keyword racketSyntax for/flvector for*/flvector
+
+" 3.2.4 Fixnums
+syntax keyword racketFunc fx+ fx- fx* fxquotient fxremainder fxmodulo fxabs
+syntax keyword racketFunc fxand fxior fxxor fxnot fxlshift fxrshift
+syntax keyword racketFunc fx= fx< fx> fx<= fx>= fxmin fxmax fx->fl fl->fx
+
+" 3.2.4.2 Fixnum Vectors
+syntax keyword racketFunc fxvector? fxvector make-fxvector fxvector-length
+syntax keyword racketFunc fxvector-ref fxvector-set! fxvector-copy in-fxvector
+syntax keyword racketFunc for/fxvector for*/fxvector
+syntax keyword racketFunc shared-fxvector make-shared-fxvector
+
+" 3.3 Strings
+syntax keyword racketFunc string? make-string string string->immutable-string string-length
+syntax keyword racketFunc string-ref string-set! substring string-copy string-copy!
+syntax keyword racketFunc string-fill! string-append string->list list->string
+syntax keyword racketFunc build-string string=? string<? string<=? string>? string>=?
+syntax keyword racketFunc string-ci=? string-ci<? string-ci<=? string-ci>? string-ci>=?
+syntax keyword racketFunc string-upcase string-downcase string-titlecase string-foldcase
+syntax keyword racketFunc string-normalize-nfd string-normalize-nfc string-normalize-nfkc
+syntax keyword racketFunc string-normalize-spaces string-trim
+syntax keyword racketFunc string-locale=? string-locale>? string-locale<?
+syntax keyword racketFunc string-locale-ci=? string-locale<=?
+syntax keyword racketFunc string-locale-upcase string-locale-downcase
+syntax keyword racketFunc string-append* string-join
+
+" 3.4 Bytestrings
+syntax keyword racketFunc bytes? make-bytes bytes bytes->immutable-bytes byte?
+syntax keyword racketFunc bytes-length bytes-ref bytes-set! subbytes bytes-copy
+syntax keyword racketFunc bytes-copy! bytes-fill! bytes-append bytes->list list->bytes
+syntax keyword racketFunc make-shared-bytes shared-bytes
+syntax keyword racketFunc bytes=? bytes<? bytes>?
+syntax keyword racketFunc bytes->string/utf-8 bytes->string/latin-1
+syntax keyword racketFunc string->bytes/locale string->bytes/latin-1 string->bytes/utf-8
+syntax keyword racketFunc string-utf-8-length bytes-utf8-ref bytes-utf-8-index
+syntax keyword racketFunc bytes-open-converter bytes-close-converter
+syntax keyword racketFunc bytes-convert bytes-convert-end bytes-converter?
+syntax keyword racketFunc locale-string-encoding
+
+" 3.5 Characters
+syntax keyword racketFunc char? char->integer integer->char
+syntax keyword racketFunc char=? char<? char<=? char>? char>=?
+syntax keyword racketFunc char-ci=? char-ci<? char-ci<=? char-ci>? char-ci>=?
+syntax keyword racketFunc char-alphabetic? char-lower-case? char-upper-case? char-title-case?
+syntax keyword racketFunc char-numeric? char-symbolic? char-punctuation? char-graphic?
+syntax keyword racketFunc char-whitespace? char-blank?
+syntax keyword racketFunc char-iso-control? char-general-category
+syntax keyword racketFunc make-known-char-range-list
+syntax keyword racketFunc char-upcase char-downcase char-titlecase char-foldcase
+
+" 3.6 Symbols
+syntax keyword racketFunc symbol? symbol-interned? symbol-unreadable?
+syntax keyword racketFunc symbol->string string->symbol
+syntax keyword racketFunc string->uninterned-symbol string->unreadable-symbol
+syntax keyword racketFunc gensym
+
+" 3.7 Regular Expressions
+syntax keyword racketFunc regexp? pregexp? byte-regexp? byte-pregexp?
+syntax keyword racketFunc regexp pregexp byte-regexp byte-pregexp
+syntax keyword racketFunc regexp-quote regexp-match regexp-match*
+syntax keyword racketFunc regexp-try-match regexp-match-positions
+syntax keyword racketFunc regexp-match-positions* regexp-match?
+syntax keyword racketFunc regexp-match-peek-positions regexp-match-peek-immediate
+syntax keyword racketFunc regexp-match-peek regexp-match-peek-positions*
+syntax keyword racketFunc regexp-match/end regexp-match-positions/end
+syntax keyword racketFunc regexp-match-peek-positions-immediat/end
+syntax keyword racketFunc regexp-split regexp-replace regexp-replace*
+syntax keyword racketFunc regexp-replace-quote
+
+" 3.8 Keywords
+syntax keyword racketFunc keyword? keyword->string string->keyword keyword<?
+
+" 3.9 Pairs and Lists
+syntax keyword racketFunc pair? null? cons car cdr null
+syntax keyword racketFunc list? list list* build-list length
+syntax keyword racketFunc list-ref list-tail append reverse map andmap ormap
+syntax keyword racketFunc for-each foldl foldr filter remove remq remv remove*
+syntax keyword racketFunc remq* remv* sort member memv memq memf
+syntax keyword racketFunc findf assoc assv assq assf
+syntax keyword racketFunc caar cadr cdar cddr caaar caadr cadar caddr cdaar
+syntax keyword racketFunc cddar cdddr caaaar caaadr caadar caaddr cadadr caddar
+syntax keyword racketFunc cadddr cdaaar cdaadr cdadar cddaar cdddar cddddr
+
+" 3.9.7 Additional List Functions and Synonyms
+" (require racket/list)
+syntax keyword racketFunc empty cons? empty? first rest
+syntax keyword racketFunc second third fourth fifth sixth seventh eighth ninth tenth
+syntax keyword racketFunc last last-pair make-list take drop split-at
+syntax keyword racketFunc take-right drop-right split-at-right add-between
+syntax keyword racketFunc append* flatten remove-duplicates filter-map
+syntax keyword racketFunc count partition append-map filter-not shuffle
+syntax keyword racketFunc argmin argmax make-reader-graph placeholder? make-placeholder
+syntax keyword racketFunc placeholder-set! placeholder-get hash-placeholder?
+syntax keyword racketFunc make-hash-placeholder make-hasheq-placeholder
+syntax keyword racketFunc make-hasheqv-placeholder make-immutable-hasheqv
+
+" 3.10 Mutable Pairs and Lists
+syntax keyword racketFunc mpair? mcons mcar mcdr
+
+" 3.11 Vectors
+syntax keyword racketFunc vector?  make-vector vector vector-immutable vector-length
+syntax keyword racketFunc vector-ref vector-set!  vector->list list->vector
+syntax keyword racketFunc vector->immutable-vector vector-fill!  vector-copy!
+syntax keyword racketFunc vector->values build-vector vector-set*!  vector-map
+syntax keyword racketFunc vector-map!  vector-append vector-take vector-take-right
+syntax keyword racketFunc vector-drop vector-drop-right vector-split-at
+syntax keyword racketFunc vector-split-at-right vector-copy vector-filter
+syntax keyword racketFunc vector-filter-not vector-count vector-argmin vector-argmax
+syntax keyword racketFunc vector-member vector-memv vector-memq
+
+" 3.12 Boxes
+syntax keyword racketFunc box?  box box-immutable unbox set-box!
+
+" 3.13 Hash Tables
+syntax keyword racketFunc hash? hash-equal? hash-eqv? hash-eq? hash-weak? hash
+syntax keyword racketFunc hasheq hasheqv
+syntax keyword racketFunc make-hash make-hasheqv make-hasheq make-weak-hash make-weak-hasheqv
+syntax keyword racketFunc make-weak-hasheq make-immutable-hash make-immutable-hasheqv
+syntax keyword racketFunc make-immutable-hasheq
+syntax keyword racketFunc hash-set! hash-set*! hash-set hash-set* hash-ref hash-ref!
+syntax keyword racketFunc hash-has-key? hash-update! hash-update hash-remove!
+syntax keyword racketFunc hash-remove hash-map hash-keys hash-values
+syntax keyword racketFunc hash->list hash-for-each hash-count
+syntax keyword racketFunc hash-iterate-first hash-iterate-next hash-iterate-key
+syntax keyword racketFunc hash-iterate-value hash-copy eq-hash-code eqv-hash-code
+syntax keyword racketFunc equal-hash-code equal-secondary-hash-code
+
+" 3.15 Dictionaries
+syntax keyword racketFunc dict? dict-mutable? dict-can-remove-keys? dict-can-functional-set?
+syntax keyword racketFunc dict-set! dict-set*! dict-set dict-set* dict-has-key? dict-ref
+syntax keyword racketFunc dict-ref! dict-update! dict-update dict-remove! dict-remove
+syntax keyword racketFunc dict-map dict-for-each dict-count dict-iterate-first dict-iterate-next
+syntax keyword racketFunc dict-iterate-key dict-iterate-value in-dict in-dict-keys
+syntax keyword racketFunc in-dict-values in-dict-pairs dict-keys dict-values
+syntax keyword racketFunc dict->list prop: dict prop: dict/contract dict-key-contract
+syntax keyword racketFunc dict-value-contract dict-iter-contract make-custom-hash
+syntax keyword racketFunc make-immutable-custom-hash make-weak-custom-hash
+
+" 3.16 Sets
+syntax keyword racketFunc set seteqv seteq set-empty? set-count set-member?
+syntax keyword racketFunc set-add set-remove set-union set-intersect set-subtract
+syntax keyword racketFunc set-symmetric-difference set=? subset? proper-subset?
+syntax keyword racketFunc set-map set-for-each set? set-equal? set-eqv? set-eq?
+syntax keyword racketFunc set/c in-set for/set for/seteq for/seteqv for*/set
+syntax keyword racketFunc for*/seteq for*/seteqv list->set list->seteq
+syntax keyword racketFunc list->seteqv set->list
+
+" 3.17 Procedures
+syntax keyword racketFunc procedure? apply compose compose1 procedure-rename procedure->method
+syntax keyword racketFunc keyword-apply procedure-arity procedure-arity?
+syntax keyword racketFunc procedure-arity-includes? procedure-reduce-arity
+syntax keyword racketFunc procedure-keywords make-keyword-procedure
+syntax keyword racketFunc procedure-reduce-keyword-arity procedure-struct-type?
+syntax keyword racketFunc procedure-extract-target checked-procedure-check-and-extract
+syntax keyword racketFunc primitive? primitive-closure? primitive-result-arity
+syntax keyword racketFunc identity const thunk thunk* negate curry curryr
+
+" 3.18 Void
+syntax keyword racketFunc void void?
+
+" 4.1 Defining Structure Types
+syntax keyword racketFunc struct struct-field-index define-struct define-struct define-struct/derived
+
+" 4.2 Creating Structure Types
+syntax keyword racketFunc make-struct-type make-struct-field-accessor make-struct-field-mutator
+
+" 4.3 Structure Type Properties
+syntax keyword racketFunc make-struct-type-property struct-type-property? struct-type-property-accessor-procedure?
+
+" 4.4 Copying and Updating Structures
+syntax keyword racketFunc struct-copy
+
+" 4.5 Structure Utilities
+syntax keyword racketFunc struct->vector struct? struct-type?
+syntax keyword racketFunc struct-constructor-procedure? struct-predicate-procedure? struct-accessor-procedure? struct-mutator-procedure?
+syntax keyword racketFunc prefab-struct-key make-prefab-struct prefab-key->struct-type
+
+" 4.6 Structure Type Transformer Binding
+syntax keyword racketFunc struct-info? check-struct-info? make-struct-info extract-struct-info
+syntax keyword racketFunc struct-auto-info? struct-auto-info-lists
+
+" 5.1 Creating Interfaces
+syntax keyword racketFunc interface interface*
+
+" 5.2 Creating Classes
+syntax keyword racketFunc class* class inspect
+syntax keyword racketFunc init init-field field inherit field init-rest
+syntax keyword racketFunc public public* pubment pubment* public-final public-final*
+syntax keyword racketFunc override override* overment overment* override-final override-final*
+syntax keyword racketFunc augride augride* augment augment* augment-final augment-final*
+syntax keyword racketFunc abstract inherit inherit/super inherit/inner
+syntax keyword racketFunc rename-inner rename-super
+syntax keyword racketFunc define/public define/pubment define/public-final
+syntax keyword racketFunc define/override define/overment define/override-final
+syntax keyword racketFunc define/augride define/augment define/augment-final
+syntax keyword racketFunc private* define/private
+
+" 5.2.3 Methods
+syntax keyword racketFunc class/derived
+syntax keyword racketFunc super inner define-local-member-name define-member-name
+syntax keyword racketFunc member-name-key generate-member-key member-name-key?
+syntax keyword racketFunc member-name-key=? member-name-key-hash-code
+
+" 5.3 Creating Objects
+syntax keyword racketFunc make-object instantiate new
+syntax keyword racketFunc super-make-object super-instantiate super-new
+
+"5.4 Field and Method Access
+syntax keyword racketFunc method-id send send/apply send/keyword-apply dynamic-send send*
+syntax keyword racketFunc get-field set-field! field-bound?
+syntax keyword racketFunc class-field-accessor class-field-mutator
+
+"5.4.3 Generics
+syntax keyword racketFunc generic send-generic make-generic
+
+" 8.1 Data-strucure contracts
+syntax keyword racketFunc flat-contract-with-explanation flat-named-contract
+" TODO where do any/c and none/c `value`s go?
+syntax keyword racketFunc or/c first-or/c and/c not/c =/c </c >/c <=/c >=/c
+syntax keyword racketFunc between/c real-in integer-in char-in natural-number/c
+syntax keyword racketFunc string-len/c printable/c one-of/c symbols vectorof
+syntax keyword racketFunc vector-immutableof vector/c box/c box-immutable/c listof
+syntax keyword racketFunc non-empty-listof list*of cons/c cons/dc list/c *list/c
+syntax keyword racketFunc syntax/c struct/c struct/dc parameter/c
+syntax keyword racketFunc procedure-arity-includes/c hash/c hash/dc channel/c
+syntax keyword racketFunc prompt-tag/c continuation-mark-key/c evt/c promise/c
+syntax keyword racketFunc flat-contract flat-contract-predicate suggest/c
+
+" 9.1 Multiple Values
+syntax keyword racketFunc values call-with-values
+
+" 10.2.2 Raising Exceptions
+syntax keyword racketFunc raise error raise-user-error raise-argument-error
+syntax keyword racketFunc raise-result-error raise-argument-error raise-range-error
+syntax keyword racketFunc raise-type-error raise-mismatch-error raise-arity-error
+syntax keyword racketFunc raise-syntax-error
+
+" 10.2.3 Handling Exceptions
+syntax keyword racketFunc call-with-exception-handler uncaught-exception-handler
+
+" 10.2.4 Configuring Default Handlers
+syntax keyword racketFunc error-escape-handler error-display-handler error-print-width
+syntax keyword racketFunc error-print-context-length error-values->string-handler
+syntax keyword racketFunc error-print-source-location
+
+" 10.2.5 Built-in Exception Types
+syntax keyword racketFunc exn exn:fail exn:fail:contract exn:fail:contract:arity
+syntax keyword racketFunc exn:fail:contract:divide-by-zero exn:fail:contract:non-fixnum-result
+syntax keyword racketFunc exn:fail:contract:continuation exn:fail:contract:variable
+syntax keyword racketFunc exn:fail:syntax exn:fail:syntax:unbound exn:fail:syntax:missing-module
+syntax keyword racketFunc exn:fail:read exn:fail:read:eof exn:fail:read:non-char
+syntax keyword racketFunc exn:fail:filesystem exn:fail:filesystem:exists
+syntax keyword racketFunc exn:fail:filesystem:version exn:fail:filesystem:errno
+syntax keyword racketFunc exn:fail:filesystem:missing-module
+syntax keyword racketFunc exn:fail:network exn:fail:network:errno exn:fail:out-of-memory
+syntax keyword racketFunc exn:fail:unsupported exn:fail:user
+syntax keyword racketFunc exn:break exn:break:hang-up exn:break:terminate
+
+" 10.3 Delayed Evaluation
+syntax keyword racketFunc promise? delay lazy force promise-forced? promise-running?
+
+" 10.3.1 Additional Promise Kinds
+syntax keyword racketFunc delay/name promise/name delay/strict delay/sync delay/thread delay/idle
+
+" 10.4 Continuations
+syntax keyword racketFunc call-with-continuation-prompt abort-current-continuation make-continuation-prompt-tag
+syntax keyword racketFunc default-continuation-prompt-tag call-with-current-continuation call/cc
+syntax keyword racketFunc call-with-composable-continuation call-with-escape-continuation call/ec
+syntax keyword racketFunc call-with-continuation-barrier continuation-prompt-available
+syntax keyword racketFunc continuation? continuation-prompt-tag dynamic-wind
+
+" 10.4.1 Additional Control Operators
+syntax keyword racketFunc call/prompt abort/cc call/comp abort fcontrol spawn splitter new-prompt
+
+" 11.3.2 Parameters
+syntax keyword racketFunc make-parameter make-derived-parameter parameter?
+syntax keyword racketFunc parameter-procedure=? current-parameterization
+syntax keyword racketFunc call-with-parameterization parameterization?
+
+" 14.1.1 Manipulating Paths
+syntax keyword racketFunc path? path-string? path-for-some-system? string->path path->string path->bytes
+syntax keyword racketFunc string->path-element bytes->path-element path-element->string path-element->bytes
+syntax keyword racketFunc path-convention-type system-path-convention-type build-type
+syntax keyword racketFunc build-type/convention-type
+syntax keyword racketFunc absolute-path? relative-path? complete-path?
+syntax keyword racketFunc path->complete-path path->directory-path
+syntax keyword racketFunc resolve-path cleanse-path expand-user-path simplify-path normal-case-path split-path
+syntax keyword racketFunc path-replace-suffix path-add-suffix
+
+" 14.1.2 More Path Utilities
+syntax keyword racketFunc explode-path file-name-from-path filename-extension find-relative-path normalize-path
+syntax keyword racketFunc path-element? path-only simple-form-path some-simple-path->string string->some-system-path
+
+" 15.6 Time
+syntax keyword racketFunc current-seconds current-inexact-milliseconds
+syntax keyword racketFunc seconds->date current-milliseconds
+
+
+syntax match racketDelimiter !\<\.\>!
+
+syntax cluster racketTop contains=racketSyntax,racketFunc,racketDelimiter
+
+syntax match racketConstant  ,\<\*\k\+\*\>,
+syntax match racketConstant  ,\<<\k\+>\>,
+
+" Non-quoted lists, and strings
+syntax region racketStruc matchgroup=racketParen start="("rs=s+1 end=")"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#("rs=s+2 end=")"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="{"rs=s+1 end="}"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#{"rs=s+2 end="}"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="\["rs=s+1 end="\]"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#\["rs=s+2 end="\]"re=e-1 contains=@racketTop
+
+for lit in ['hash', 'hasheq', 'hasheqv']
+  execute printf('syntax match racketLit "\<%s\>" nextgroup=@racketParen containedin=ALLBUT,.*String,.*Comment', '#'.lit)
+endfor
+
+for lit in ['rx', 'rx#', 'px', 'px#']
+  execute printf('syntax match racketRe "\<%s\>" nextgroup=@racketString containedin=ALLBUT,.*String,.*Comment,', '#'.lit)
+endfor
+
+unlet lit
+
+" Simple literals
+
+" Strings
+
+syntax match racketStringEscapeError "\\." contained display
+
+syntax match racketStringEscape "\\[abtnvfre'"\\]"        contained display
+syntax match racketStringEscape "\\$"                     contained display
+syntax match racketStringEscape "\\\o\{1,3}\|\\x\x\{1,2}" contained display
+
+syntax match racketUStringEscape "\\u\x\{1,4}\|\\U\x\{1,8}" contained display
+syntax match racketUStringEscape "\\u\x\{4}\\u\x\{4}"       contained display
+
+syntax region racketString start=/\%(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/ contains=racketStringEscapeError,racketStringEscape,racketUStringEscape
+syntax region racketString start=/#"/           skip=/\\[\\"]/ end=/"/ contains=racketStringEscapeError,racketStringEscape
+
+if exists("racket_no_string_fold")
+  syn region racketString start=/#<<\z(.*\)$/ end=/^\z1$/
+else
+  syn region racketString start=/#<<\z(.*\)$/ end=/^\z1$/ fold
+endif
+
+
+syntax cluster racketTop  add=racketError,racketConstant,racketStruc,racketString
+
+" Numbers
+
+" anything which doesn't match the below rules, but starts with a #d, #b, #o,
+" #x, #i, or #e, is an error
+syntax match racketNumberError         "\<#[xdobie]\k*"
+
+syntax match racketContainedNumberError   "\<#o\k*[^-+0-7delfinas#./@]\>"
+syntax match racketContainedNumberError   "\<#b\k*[^-+01delfinas#./@]\>"
+syntax match racketContainedNumberError   "\<#[ei]#[ei]"
+syntax match racketContainedNumberError   "\<#[xdob]#[xdob]"
+
+" start with the simpler sorts
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+[-+]\d\+\(/\d\+\)\?i\>" contains=racketContainedNumberError
+
+" different possible ways of expressing complex values
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError
+
+" hex versions of the above (separate because of the different possible exponent markers)
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+[-+]\x\+\(/\x\+\)\?i\>"
+
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f][-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber    "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>"
+
+" these work for any radix
+syntax match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]i\?\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
+syntax match racketNumber    "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError
+
+syntax keyword racketBoolean  #t #f #true #false #T #F
+
+syntax match racketError   "\<#\\\k*\>"
+
+syntax match racketChar    "\<#\\.\w\@!"
+syntax match racketChar    "\<#\\space\>"
+syntax match racketChar    "\<#\\newline\>"
+syntax match racketChar    "\<#\\return\>"
+syntax match racketChar    "\<#\\null\?\>"
+syntax match racketChar    "\<#\\backspace\>"
+syntax match racketChar    "\<#\\tab\>"
+syntax match racketChar    "\<#\\linefeed\>"
+syntax match racketChar    "\<#\\vtab\>"
+syntax match racketChar    "\<#\\page\>"
+syntax match racketChar    "\<#\\rubout\>"
+syntax match racketChar    "\<#\\\o\{1,3}\>"
+syntax match racketChar    "\<#\\x\x\{1,2}\>"
+syntax match racketChar    "\<#\\u\x\{1,6}\>"
+
+syntax cluster racketTop  add=racketNumber,racketBoolean,racketChar
+
+" Command-line parsing
+syntax keyword racketExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
+
+syntax match racketSyntax    "#lang "
+syntax match racketExtSyntax "#:\k\+"
+
+syntax cluster racketTop  add=racketExtFunc,racketExtSyntax
+
+" syntax quoting, unquoting and quasiquotation
+syntax match racketQuote "#\?['`]"
+
+syntax match racketUnquote "#,"
+syntax match racketUnquote "#,@"
+syntax match racketUnquote ","
+syntax match racketUnquote ",@"
+
+" Comments
+syntax match racketSharpBang "\%^#![ /].*" display
+syntax match racketComment /;.*$/ contains=racketTodo,racketNote,@Spell
+syntax region racketMultilineComment start=/#|/ end=/|#/ contains=racketMultilineComment,racketTodo,racketNote,@Spell
+syntax match racketFormComment "#;" nextgroup=@racketTop
+
+syntax match racketTodo /\C\<\(FIXME\|TODO\|XXX\)\ze:\?\>/ contained
+syntax match racketNote /\CNOTE\ze:\?/ contained
+
+syntax cluster racketTop  add=racketQuote,racketUnquote,racketComment,racketMultilineComment,racketFormComment
+
+" Synchronization and the wrapping up...
+syntax sync match matchPlace grouphere NONE "^[^ \t]"
+" ... i.e. synchronize on a line that starts at the left margin
+
+" Define the default highlighting.
+highlight default link racketSyntax Statement
+highlight default link racketFunc Function
+
+highlight default link racketString String
+highlight default link racketStringEscape Special
+highlight default link racketUStringEscape Special
+highlight default link racketStringEscapeError Error
+highlight default link racketChar Character
+highlight default link racketBoolean Boolean
+
+highlight default link racketNumber Number
+highlight default link racketNumberError Error
+highlight default link racketContainedNumberError Error
+
+highlight default link racketQuote SpecialChar
+highlight default link racketUnquote SpecialChar
+
+highlight default link racketDelimiter Delimiter
+highlight default link racketParen Delimiter
+highlight default link racketConstant Constant
+
+highlight default link racketLit Type
+highlight default link racketRe Type
+
+highlight default link racketComment Comment
+highlight default link racketMultilineComment Comment
+highlight default link racketFormComment SpecialChar
+highlight default link racketSharpBang Comment
+highlight default link racketTodo Todo
+highlight default link racketNote SpecialComment
+highlight default link racketError Error
+
+highlight default link racketExtSyntax Type
+highlight default link racketExtFunc PreProc
+
+let b:current_syntax = "racket"