Update runtime files
diff --git a/runtime/syntax/basic.vim b/runtime/syntax/basic.vim
index 7fe411a..b6bf23a 100644
--- a/runtime/syntax/basic.vim
+++ b/runtime/syntax/basic.vim
@@ -3,7 +3,7 @@
 " Maintainer:		Doug Kearns <dougkearns@gmail.com>
 " Previous Maintainer:	Allan Kelly <allan@fruitloaf.co.uk>
 " Contributors:		Thilo Six
-" Last Change:		2021 Aug 08
+" Last Change:		2022 Jun 22
 
 " First version based on Micro$soft QBASIC circa 1989, as documented in
 " 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989.
@@ -344,7 +344,7 @@
 hi def link basicDataString	    basicString
 hi def link basicFilenumber	    basicTypeSuffix " TODO: better group
 hi def link basicFloat		    Float
-hi def link basicFunction	    Identifier
+hi def link basicFunction	    Function
 hi def link basicKeyword	    Keyword
 hi def link basicLineIdentifier	    LineNr
 hi def link basicLineContinuation   Special
diff --git a/runtime/syntax/fetchmail.vim b/runtime/syntax/fetchmail.vim
index 7a42105..f9c8e01 100644
--- a/runtime/syntax/fetchmail.vim
+++ b/runtime/syntax/fetchmail.vim
@@ -1,7 +1,10 @@
 " Vim syntax file
-" Language:             fetchmail(1) RC File
-" Previous Maintainer:  Nikolai Weibull <now@bitwi.se>
-" Latest Revision:      2006-04-19
+" Language:		fetchmail(1) RC File
+" Maintainer:		Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer:	Nikolai Weibull <now@bitwi.se>
+" Latest Revision:	2022 Jun 30
+
+" Version 6.4.3
 
 if exists("b:current_syntax")
   finish
@@ -10,64 +13,69 @@
 let s:cpo_save = &cpo
 set cpo&vim
 
-syn keyword fetchmailTodo       contained FIXME TODO XXX NOTE
+syn keyword fetchmailTodo	contained FIXME TODO XXX NOTE
 
-syn region  fetchmailComment    start='#' end='$' contains=fetchmailTodo,@Spell
+syn region  fetchmailComment	start='#' end='$' contains=fetchmailTodo,@Spell
 
-syn match   fetchmailNumber     display '\<\d\+\>'
+syn match   fetchmailNumber	display '\<\d\+\>'
 
-syn region  fetchmailString     start=+"+ skip=+\\\\\|\\"+ end=+"+
-                                \ contains=fetchmailStringEsc
-syn region  fetchmailString     start=+'+ skip=+\\\\\|\\'+ end=+'+
-                                \ contains=fetchmailStringEsc
+syn region  fetchmailString	start=+"+ skip=+\\\\\|\\"+ end=+"+
+				\ contains=fetchmailStringEsc
+syn region  fetchmailString	start=+'+ skip=+\\\\\|\\'+ end=+'+
+				\ contains=fetchmailStringEsc
 
-syn match   fetchmailStringEsc  contained '\\\([ntb]\|0\d*\|x\x\+\)'
+syn match   fetchmailStringEsc	contained '\\\([ntb]\|0\d*\|x\x\+\)'
 
-syn region  fetchmailKeyword    transparent matchgroup=fetchmailKeyword
-                                \ start='\<poll\|skip\|defaults\>'
-                                \ end='\<poll\|skip\|defaults\>'
-                                \ contains=ALLBUT,fetchmailOptions,fetchmailSet
+syn region  fetchmailKeyword	transparent matchgroup=fetchmailKeyword
+				\ start='\<poll\|skip\|defaults\>'
+				\ end='\<poll\|skip\|defaults\>'
+				\ contains=ALLBUT,fetchmailOptions,fetchmailSet
 
 syn keyword fetchmailServerOpts contained via proto[col] local[domains] port
-                                \ auth[enticate] timeout envelope qvirtual aka
-                                \ interface monitor plugin plugout dns
-                                \ checkalias uidl interval netsec principal
-                                \ esmtpname esmtppassword
-                                \ sslcertck sslcertpath sslfingerprint
+				\ service auth[enticate] timeout envelope
+				\ qvirtual aka interface monitor plugin plugout
+				\ dns checkalias uidl interval tracepolls
+				\ principal esmtpname esmtppassword
+" removed in 6.3.0
+syn keyword fetchmailServerOpts contained netsec
+syn match   fetchmailServerOpts contained '\<bad-header\>'
 syn match   fetchmailServerOpts contained '\<no\_s\+\(envelope\|dns\|checkalias\|uidl\)'
 
-syn keyword fetchmailUserOpts   contained user[name] is to pass[word] ssl
-                                \ sslcert sslkey sslproto folder smtphost
-                                \ fetchdomains smtpaddress smtpname antispam
-                                \ mda bsmtp preconnect postconnect keep flush
-                                \ fetchall rewrite stripcr forcecr pass8bits
-                                \ dropstatus dropdelivered mimedecode idle
-                                \ limit warnings batchlimit fetchlimit expunge
-                                \ tracepolls properties
-syn match   fetchmailUserOpts   contained '\<no\_s\+\(keep\|flush\|fetchall\|rewrite\|stripcr\|forcecr\|pass8bits\|dropstatus\|dropdelivered\|mimedecode\|noidle\)'
+syn keyword fetchmailUserOpts	contained user[name] is to pass[word] ssl
+				\ sslcert sslcertck sslcertfile sslcertpath
+				\ sslfingerprint sslkey sslproto folder
+				\ smtphost fetchdomains smtpaddress smtpname
+				\ antispam mda bsmtp preconnect postconnect
+				\ keep flush limitflush fetchall rewrite
+				\ stripcr forcecr pass8bits dropstatus
+				\ dropdelivered mimedecode idle limit warnings
+				\ batchlimit fetchlimit fetchsizelimit
+				\ fastuidl expunge properties
+				\ sslcommonname
+syn match   fetchmailUserOpts	contained '\<no\_s\+\(sslcertck\|keep\|flush\|fetchall\|rewrite\|stripcr\|forcecr\|pass8bits\|dropstatus\|dropdelivered\|mimedecode\|idle\)'
 
-syn keyword fetchmailSpecial    contained here there
+syn keyword fetchmailSpecial	contained here there
 
-syn keyword fetchmailNoise      and with has wants options
-syn match   fetchmailNoise      display '[:;,]'
+syn keyword fetchmailNoise	and with has wants options
+syn match   fetchmailNoise	display '[:;,]'
 
-syn keyword fetchmailSet        nextgroup=fetchmailOptions skipwhite skipnl set
+syn keyword fetchmailSet	nextgroup=fetchmailOptions skipwhite skipnl set
 
-syn keyword fetchmailOptions    daemon postmaster bouncemail spambounce logfile
-                                \ idfile syslog nosyslog properties
-syn match   fetchmailOptions    '\<no\_s\+\(bouncemail\|spambounce\)'
+syn keyword fetchmailOptions	daemon postmaster bouncemail spambounce
+				\ softbounce logfile idfile syslog properties
+syn match   fetchmailOptions	'\<no\_s\+\(bouncemail\|spambounce\|softbounce\|syslog\)'
 
-hi def link fetchmailComment    Comment
-hi def link fetchmailTodo       Todo
-hi def link fetchmailNumber     Number
-hi def link fetchmailString     String
-hi def link fetchmailStringEsc  SpecialChar
-hi def link fetchmailKeyword    Keyword
+hi def link fetchmailComment	Comment
+hi def link fetchmailTodo	Todo
+hi def link fetchmailNumber	Number
+hi def link fetchmailString	String
+hi def link fetchmailStringEsc	SpecialChar
+hi def link fetchmailKeyword	Keyword
 hi def link fetchmailServerOpts Identifier
-hi def link fetchmailUserOpts   Identifier
-hi def link fetchmailSpecial    Special
-hi def link fetchmailSet        Keyword
-hi def link fetchmailOptions    Identifier
+hi def link fetchmailUserOpts	Identifier
+hi def link fetchmailSpecial	Special
+hi def link fetchmailSet	Keyword
+hi def link fetchmailOptions	Identifier
 
 let b:current_syntax = "fetchmail"
 
diff --git a/runtime/syntax/freebasic.vim b/runtime/syntax/freebasic.vim
index 68e838f..7549d02 100644
--- a/runtime/syntax/freebasic.vim
+++ b/runtime/syntax/freebasic.vim
@@ -1,14 +1,14 @@
 " Vim syntax file
-" Language:    FreeBasic
-" Maintainer:  Mark Manning <markem@sim1.us>
-" Updated:     10/9/2019
-" Version:		7.0b
+" Language:		FreeBASIC
+" Maintainer:		Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer:	Mark Manning <markem@sim1.us>
+" Last Change:		2022 Jun 26
 "
 " Description:
 "
 "	Based originally on the work done by Allan Kelly <Allan.Kelly@ed.ac.uk>
 "	Updated by Mark Manning <markem@sim1.us>
-"	Applied FreeBasic support to the already excellent support
+"	Applied FreeBASIC support to the already excellent support
 "	for standard basic syntax (like QB).
 "
 "	First version based on Micro$soft QBASIC circa
@@ -17,215 +17,595 @@
 "	not a complete implementation yet.  Send suggestions to
 "	the maintainer.
 "
+"	TODO: split this into separate dialect-based files, possibly with a common base
+"
 "	Quit when a (custom) syntax file was already loaded (Taken from c.vim)
 "
 if exists("b:current_syntax")
   finish
 endif
 "
+"	Dialect detection
+"
+let s:lang = freebasic#GetDialect()
+"
+"	Whitespace Errors
+"
+if exists("freebasic_space_errors")
+  if !exists("freebasic_no_trail_space_error")
+    syn match freebasicSpaceError display excludenl "\s\+$"
+  endif
+  if !exists("freebasic_no_tab_space_error")
+    syn match freebasicSpaceError display " \+\t"me=e-1
+  endif
+endif
+"
 "	Be sure to turn on the "case ignore" since current versions
 "	of freebasic support both upper as well as lowercase
 "	letters. - MEM 10/1/2006
 "
 syn case ignore
 "
-"	This list of keywords is taken directly from the FreeBasic
-"	user's guide as presented by the FreeBasic online site.
-"
-syn keyword	freebasicArrays			ERASE LBOUND REDIM PRESERVE UBOUND
-
-syn keyword	freebasicBitManipulation	BIT BITRESET BITSET HIBYTE HIWORD LOBYTE LOWORD SHL SHR
-
-syn keyword	freebasicCompilerSwitches	DEFBYTE DEFDBL DEFINT DEFLNG DEFLNGINT DEFSHORT DEFSNG DEFSTR
-syn keyword	freebasicCompilerSwitches	DEFUBYTE DEFUINT DEFULNGINT DEFUSHORT
-syn match	freebasicCompilerSwitches	"\<option\s+\(BASE\|BYVAL\|DYNAMIC\|ESCAPE\|EXPLICIT\|NOKEYWORD\)\>"
-syn match	freebasicCompilerSwitches	"\<option\s+\(PRIVATE\|STATIC\)\>"
-
-syn region	freebasicConditional		start="\son\s+" skip=".*" end="gosub"
-syn region	freebasicConditional		start="\son\s+" skip=".*" end="goto"
-syn match	freebasicConditional		"\<select\s+case\>"
-syn keyword	freebasicConditional		if iif then case else elseif with
-
-syn match	freebasicConsole		"\<open\s+\(CONS\|ERR\|PIPE\|SCRN\)\>"
-syn keyword	freebasicConsole		BEEP CLS CSRLIN LOCATE PRINT POS SPC TAB VIEW WIDTH
-
-syn keyword	freebasicDataTypes		BYTE AS DIM CONST DOUBLE ENUM INTEGER LONG LONGINT SHARED SHORT STRING
-syn keyword	freebasicDataTypes		SINGLE TYPE UBYTE UINTEGER ULONGINT UNION UNSIGNED USHORT WSTRING ZSTRING
-
-syn keyword	freebasicDateTime		DATE DATEADD DATEDIFF DATEPART DATESERIAL DATEVALUE DAY HOUR MINUTE
-syn keyword	freebasicDateTime		MONTH MONTHNAME NOW SECOND SETDATE SETTIME TIME TIMESERIAL TIMEVALUE
-syn keyword	freebasicDateTime		TIMER YEAR WEEKDAY WEEKDAYNAME
-
-syn keyword	freebasicDebug			ASSERT STOP
-
-syn keyword	freebasicErrorHandling		ERR ERL ERROR LOCAL RESUME
-syn match	freebasicErrorHandling		"\<resume\s+next\>"
-syn match	freebasicErrorHandling		"\<on\s+error\>"
-
-syn match	freebasicFiles			"\<get\s+#\>"
-syn match	freebasicFiles			"\<input\s+#\>"
-syn match	freebasicFiles			"\<line\s+input\s+#\>"
-syn match	freebasicFiles			"\<put\s+#\>"
-syn keyword	freebasicFiles			ACCESS APPEND BINARY BLOAD BSAVE CLOSE EOF FREEFILE INPUT LOC
-syn keyword	freebasicFiles			LOCK LOF OPEN OUTPUT RANDOM RESET SEEK UNLOCK WRITE
-
-syn keyword	freebasicFunctions		ALIAS ANY BYREF BYVAL CALL CDECL CONSTRUCTOR DESTRUCTOR
-syn keyword	freebasicFunctions		DECLARE FUNCTION LIB OVERLOAD PASCAL STATIC SUB STDCALL
-syn keyword	freebasicFunctions		VA_ARG VA_FIRST VA_NEXT
-
-syn match	freebasicGraphics		"\<palette\s+get\>"
-syn keyword	freebasicGraphics		ALPHA CIRCLE CLS COLOR CUSTOM DRAW FLIP GET
-syn keyword	freebasicGraphics		IMAGECREATE IMAGEDESTROY LINE PAINT PALETTE PCOPY PMAP POINT
-syn keyword	freebasicGraphics		PRESET PSET PUT RGB RGBA SCREEN SCREENCOPY SCREENINFO SCREENLIST
-syn keyword	freebasicGraphics		SCREENLOCK SCREENPTR SCREENRES SCREENSET SCREENSYNC SCREENUNLOCK
-syn keyword	freebasicGraphics		TRANS USING VIEW WINDOW
-
-syn match	freebasicHardware		"\<open\s+com\>"
-syn keyword	freebasicHardware		INP OUT WAIT LPT LPOS LPRINT
-
-syn keyword	freebasicLogical		AND EQV IMP OR NOT XOR
-
-syn keyword	freebasicMath			ABS ACOS ASIN ATAN2 ATN COS EXP FIX INT LOG MOD RANDOMIZE
-syn keyword	freebasicMath			RND SGN SIN SQR TAN
-
-syn keyword	freebasicMemory			ALLOCATE CALLOCATE CLEAR DEALLOCATE FIELD FRE PEEK POKE REALLOCATE
-
-syn keyword	freebasicMisc			ASM DATA LET TO READ RESTORE SIZEOF SWAP OFFSETOF
-
-syn keyword	freebasicModularizing		CHAIN COMMON EXPORT EXTERN DYLIBFREE DYLIBLOAD DYLIBSYMBOL
-syn keyword	freebasicModularizing		PRIVATE PUBLIC
-
-syn keyword	freebasicMultithreading		MUTEXCREATE MUTEXDESTROY MUTEXLOCK MUTEXUNLOCK THREADCREATE THREADWAIT
-
-syn keyword	freebasicShell			CHDIR DIR COMMAND ENVIRON EXEC EXEPATH KILL NAME MKDIR RMDIR RUN
-
-syn keyword	freebasicEnviron		SHELL SYSTEM WINDOWTITLE POINTERS
-
-syn keyword	freebasicLoops			FOR LOOP WHILE WEND DO CONTINUE STEP UNTIL next
-
-syn match	freebasicInclude		"\<#\s*\(inclib\|include\)\>"
-syn match	freebasicInclude		"\<\$\s*include\>"
-
-syn keyword	freebasicPointer		PROCPTR PTR SADD STRPTR VARPTR
-
-syn keyword	freebasicPredefined		__DATE__ __FB_DOS__ __FB_LINUX__ __FB_MAIN__ __FB_MIN_VERSION__
-syn keyword	freebasicPredefined		__FB_SIGNATURE__ __FB_VERSION__ __FB_WIN32__ __FB_VER_MAJOR__
-syn keyword	freebasicPredefined		__FB_VER_MINOR__ __FB_VER_PATCH__ __FILE__ __FUNCTION__
-syn keyword	freebasicPredefined		__LINE__ __TIME__
-
-syn match	freebasicPreProcessor		"\<^#\s*\(define\|undef\)\>"
-syn match	freebasicPreProcessor		"\<^#\s*\(ifdef\|ifndef\|else\|elseif\|endif\|if\)\>"
-syn match	freebasicPreProcessor		"\<#\s*error\>"
-syn match	freebasicPreProcessor		"\<#\s*\(print\|dynamic\|static\)\>"
-syn keyword	freebasicPreProcessor		DEFINED ONCE
-
-syn keyword	freebasicProgramFlow		END EXIT GOSUB GOTO
-syn keyword	freebasicProgramFlow		IS RETURN SCOPE SLEEP
-
-syn keyword	freebasicString			INSTR LCASE LEFT LEN LSET LTRIM MID RIGHT RSET RTRIM
-syn keyword	freebasicString			SPACE STRING TRIM UCASE ASC BIN CHR CVD CVI CVL CVLONGINT
-syn keyword	freebasicString			CVS CVSHORT FORMAT HEX MKD MKI MKL MKLONGINT MKS MKSHORT
-syn keyword	freebasicString			OCT STR VAL VALLNG VALINT VALUINT VALULNG
-
-syn keyword	freebasicTypeCasting		CAST CBYTE CDBL CINT CLNG CLNGINT CPTR CSHORT CSIGN CSNG
-syn keyword	freebasicTypeCasting		CUBYTE CUINT CULNGINT CUNSG CURDIR CUSHORT
-
-syn match	freebasicUserInput		"\<line\s+input\>"
-syn keyword	freebasicUserInput		GETJOYSTICK GETKEY GETMOUSE INKEY INPUT MULTIKEY SETMOUSE
-"
 "	Do the Basic variables names first.  This is because it
 "	is the most inclusive of the tests.  Later on we change
 "	this so the identifiers are split up into the various
 "	types of identifiers like functions, basic commands and
 "	such. MEM 9/9/2006
 "
-syn match	freebasicIdentifier			"\<[a-zA-Z_][a-zA-Z0-9_]*\>"
-syn match	freebasicGenericFunction	"\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*("me=e-1,he=e-1
+if s:lang =~# '\<\%(qb\|fblite\)\>'
+  syn iskeyword @,48-57,_,192-255,.
+  syn match	freebasicIdentifier		"\<\h\%(\w\|\.\)*\>"
+  syn match	freebasicGenericFunction	"\<\h\%(\w\|\.\)*\>\ze\s*("
+else
+  syn iskeyword @,48-57,_,192-255
+  syn match	freebasicIdentifier		"\<\h\w*\>"
+  syn match	freebasicGenericFunction	"\<\h\w*\>\ze\s*("
+endif
 "
-"	Function list
+"	This list of keywords is taken directly from the FreeBASIC
+"	user's guide as presented by the FreeBASIC online site.
 "
-syn keyword	freebasicTodo		contained TODO
+syn keyword	freebasicArrays			ERASE LBOUND PRESERVE REDIM UBOUND
+
+" array.bi
+syn keyword	freebasicArrays			ARRAYLEN ARRAYSIZE
+if s:lang == "fb"
+  syn keyword	freebasicArrays			ArrayConstDescriptorPtr ArrayDescriptorPtr FBARRAY
+endif
+
+if s:lang == "qb"
+  syn keyword	freebasicAsm			__ASM
+  syn match	freebasicAsm			"\<end\s\+__asm\>"
+else
+  syn keyword	freebasicAsm			ASM
+  syn match	freebasicAsm			"\<end\s\+asm\>"
+endif
+
+if s:lang == "qb"
+  syn keyword	freebasicBitManipulation	__BIT __BITRESET __BITSET __HIBYTE __HIWORD __LOBYTE __LOWORD
+else
+  syn keyword	freebasicBitManipulation	BIT BITRESET BITSET HIBYTE HIWORD LOBYTE LOWORD
+endif
+
+if s:lang != "fb"
+  syn keyword	freebasicCompilerSwitches	DEFDBL DEFINT DEFLNG DEFSNG DEFSTR
+endif
+if s:lang == "qb"
+  syn keyword	freebasicCompilerSwitches	__DEFBYTE __DEFLONGINT __DEFSHORT __DEFUBYTE __DEFUINT __DEFULONGINT __DEFUSHORT
+elseif s:lang == "fblite" || s:lang == "deprecated"
+  syn keyword	freebasicCompilerSwitches	DEFBYTE DEFLONGINT DEFSHORT DEFUBYTE DEFUINT DEFUILONGINT DEFUSHORT
+endif
+
+syn match	freebasicCompilerSwitches	"\<option\s\+\%(BASE\|BYVAL\|DYNAMIC\|ESCAPE\|EXPLICIT\|GOSUB\|NOGOSUB\)\>"
+syn match	freebasicCompilerSwitches	"\<option\s\+\%(NOKEYWORD\|PRIVATE\|STATIC\)\>"
+
+syn keyword	freebasicData			DATA READ RESTORE
+
+syn keyword	freebasicProgramFlow		EXIT GOTO RETURN SLEEP
+syn match	freebasicProgramFlow		"\<end\>"
+if s:lang == "qb"
+  syn keyword	freebasicProgramFlow		__SLEEP
+endif
+if s:lang == "fblite" || s:lang == "qb"
+  syn keyword	freebasicProgramFlow		GOSUB
+endif
+if s:lang == "fb" || s:lang == "deprecated"
+  syn keyword	freebasicProgramFlow		SCOPE
+  syn match	freebasicProgramFlow		"\<end\s\+scope\>"
+endif
+
+if s:lang == "fblite" || s:lang == "qb"
+  syn region	freebasicConditional		matchgroup=freebasicConditional start="\<on\>" end="\<gosub\>" transparent
+  syn region	freebasicConditional		matchgroup=freebasicConditional start="\<on\>" end="\<goto\>"  transparent
+endif
+syn keyword	freebasicConditional		IF THEN ELSE ELSEIF
+if s:lang == "qb"
+  syn keyword	freebasicConditional		__IIF __WITH
+  syn match	freebasicConditional		"\<end\s\+__with\>"
+else
+  syn keyword	freebasicConditional		IIF WITH
+  syn match	freebasicConditional		"\<end\s\+with\>"
+endif
+syn match	freebasicConditional		"\<end\s\+if\>"
+syn match	freebasicConditional		"\<select\s\+case\>"
+syn match	freebasicConditional		"\<case\>"
+syn match	freebasicConditional		"\<case\s\+is\>"
+syn match	freebasicConditional		"\<end\s\+select\>"
+
+syn keyword	freebasicConsole		BEEP CLS CSRLIN LOCATE PRINT POS SPC TAB USING VIEW WIDTH
+syn match	freebasicConsole		"?"
+
+syn keyword	freebasicDataTypes		SINGLE DOUBLE INTEGER LONG
+syn match	freebasicDataTypes		"\<string\>"
+syn keyword	freebasicDataTypes		AS DIM CONST ENUM SHARED TYPE
+syn match	freebasicDataTypes		"\<end\s\+enum\>"
+syn match	freebasicDataTypes		"\<end\s\+type\>"
+if s:lang == "qb"
+  syn keyword	freebasicDataTypes		__BOOLEAN __BYTE __LONGINT __SHORT __UBYTE __UINTEGER __ULONG __ULONGINT __UNSIGNED __USHORT __ZSTRING
+  syn match	freebasicDataTypes		"\<__WSTRING\>"
+  syn keyword	freebasicDataTypes		__EXPLICIT __EXTENDS __IMPLEMENTS __OBJECT __POINTER __PTR __SIZEOF __TYPEOF
+  syn keyword	freebasicDataTypes		__UNION
+  syn match	freebasicDataTypes		"\<end\s\+__union\>"
+else
+  syn keyword	freebasicDataTypes		BOOLEAN BYTE LONGINT SHORT UBYTE UINTEGER ULONG ULONGINT UNSIGNED USHORT ZSTRING
+  syn match	freebasicDataTypes		"\<WSTRING\>"
+  syn keyword	freebasicDataTypes		EXPLICIT EXTENDS IMPLEMENTS OBJECT POINTER PTR SIZEOF TYPEOF
+  syn keyword	freebasicDataTypes		UNION
+  syn match	freebasicDataTypes		"\<end\s\+union\>"
+endif
+if s:lang == "fb"
+  syn keyword	freebasicDataTypes		BASE CLASS THIS VAR
+endif
+
+if s:lang == "qb"
+  syn match	freebasicDateTime		"\<\%(date\|time\)\$"
+elseif s:lang == "fblite" || s:lang == "deprecated"
+  syn match	freebasicDateTime		"\<\%(date\|time\)\>\$\="
+else " fb
+  syn keyword	freebasicDateTime		DATE TIME
+endif
+syn keyword	freebasicDateTime		SETDATE SETTIME
+
+" datetime.bi
+syn keyword	freebasicDateTime		DATEADD DATEDIFF DATEPART DATESERIAL DATEVALUE DAY HOUR ISDATE MINUTE
+syn keyword	freebasicDateTime		MONTH MONTHNAME NOW SECOND TIMESERIAL TIMEVALUE
+syn keyword	freebasicDateTime		TIMER YEAR WEEKDAY WEEKDAYNAME
+
+syn keyword	freebasicDebug			STOP
+if s:lang == "qb"
+  syn keyword	freebasicDebug			__ASSERT __ASSERTWARN
+else
+  syn keyword	freebasicDebug			ASSERT ASSERTWARN
+endif
+
+syn keyword	freebasicErrorHandling		ERR ERL ERROR
+if s:lang == "qb"
+  syn keyword	freebasicErrorHandling		__ERFN __ERMN
+  syn match	freebasicErrorHandling		"\<on\s\+error\>"
+else
+  syn keyword	freebasicErrorHandling		ERFN ERMN
+  syn match	freebasicErrorHandling		"\<on\s\+\%(local\s\+\)\=error\>"
+endif
+if s:lang != "fb"
+  syn match	freebasicErrorHandling		"\<resume\%(\s\+next\)\=\>"
+endif
+
+syn match	freebasicFiles			"\<get\s\+#\>"
+syn match	freebasicFiles			"\<input\s\+#\>"
+syn match	freebasicFiles			"\<line\s\+input\s\+#\>"
+syn match	freebasicFiles			"\<put\s\+#\>"
+syn keyword	freebasicFiles			ACCESS APPEND BINARY CLOSE EOF FREEFILE INPUT LOC
+syn keyword	freebasicFiles			LOCK LOF OUTPUT RANDOM RESET SEEK UNLOCK WRITE
+syn match	freebasicFiles			"\<open\>"
+if s:lang == "qb"
+  syn keyword	freebasicFiles			__ENCODING
+else
+  syn keyword	freebasicFiles			ENCODING WINPUT
+  syn match	freebasicFiles			"\<open\s\+\%(cons\|err\|pipe\|scrn\)\>"
+endif
+
+" file.bi
+syn keyword	freebasicFiles			FILEATTR FILECOPY FILEDATETIME FILEEXISTS FILEFLUSH FILELEN FILESETEOF
+
+syn keyword	freebasicFunctions		ALIAS BYREF BYVAL CDECL DECLARE LIB NAKED PASCAL STATIC STDCALL
+syn match	freebasicFunctions		"\<option\ze\s*("
+
+if s:lang == "qb"
+  syn keyword	freebasicFunctions		__CVA_ARG __CVA_COPY __CVA_END __CVA_LIST __CVA_START
+  syn keyword	freebasicFunctions		__VA_ARG __VA_FIRST __VA_NEXT
+else
+  syn keyword	freebasicFunctions		CVA_ARG CVA_COPY CVA_END CVA_LIST CVA_START
+  syn keyword	freebasicFunctions		VA_ARG VA_FIRST VA_NEXT
+  syn keyword	freebasicFunctions		ANY OVERLOAD
+endif
+
+syn keyword	freebasicFunctions		FUNCTION SUB
+syn match	freebasicFunctions		"\<end\s\+function\>"
+syn match	freebasicFunctions		"\<end\s\+sub\>"
+
+if s:lang == "fb"
+  syn keyword	freebasicFunctions		ABSTRACT OVERRIDE VIRTUAL __THISCALL
+  syn keyword	freebasicFunctions		CONSTRUCTOR DESTRUCTOR OPERATOR PROPERTY
+  syn match	freebasicFunctions		"\<end\s\+constructor\>"
+  syn match	freebasicFunctions		"\<end\s\+destructor\>"
+  syn match	freebasicFunctions		"\<end\s\+operator\>"
+  syn match	freebasicFunctions		"\<end\s\+property\>"
+else
+  syn keyword	freebasicFunctions		CALL
+endif
+
+syn match	freebasicGraphics		"\<palette\s\+get\>"
+syn keyword	freebasicGraphics		ADD ALPHA BLOAD BSAVE CIRCLE CLS COLOR DRAW GET
+syn keyword	freebasicGraphics		LINE PAINT PALETTE PCOPY PMAP POINT
+syn keyword	freebasicGraphics		PRESET PSET PUT SCREEN
+syn keyword	freebasicGraphics		TRANS WINDOW
+if s:lang == "qb"
+  syn keyword	freebasicGraphics		__FLIP __IMAGECONVERTROW __IMAGECREATE __IMAGEDESTROY __IMAGEINFO __POINTCOORD
+  syn keyword	freebasicGraphics		__RGB __RGBA __SCREENCOPY __SCREENCONTROL __SCREENEVENT __SCREENGLPROC __SCREENINFO
+  syn keyword	freebasicGraphics		__SCREENLIST __SCREENLOCK __SCREENPTR __SCREENRES __SCREENSET __SCREENSYNC
+  syn keyword	freebasicGraphics		__SCREENUNLOCK __WINDOWTITLE
+else
+  syn keyword	freebasicGraphics		CUSTOM
+  syn keyword	freebasicGraphics		FLIP IMAGECONVERTROW IMAGECREATE IMAGEDESTROY IMAGEINFO POINTCOORD
+  syn keyword	freebasicGraphics		RGB RGBA SCREENCOPY SCREENCONTROL SCREENEVENT SCREENGLPROC SCREENINFO
+  syn keyword	freebasicGraphics		SCREENLIST SCREENLOCK SCREENPTR SCREENRES SCREENSET SCREENSYNC
+  syn keyword	freebasicGraphics		SCREENUNLOCK WINDOWTITLE
+endif
+
+if s:lang != "qb"
+  syn match	freebasicHardware		"\<open\s\+\%(com\|lpt\)\>"
+endif
+syn keyword	freebasicHardware		INP OUT WAIT LPOS LPRINT
+
+syn keyword	freebasicMath			ABS ATN COS EXP FIX FRAC INT LOG MOD RANDOMIZE RND SGN SIN SQR TAN
+
+if s:lang == "qb"
+  syn keyword	freebasicMath			__ACOS __ASIN __ATAN2
+else
+  syn keyword	freebasicMath			ACOS ASIN ATAN2
+endif
+
+if s:lang == "qb"
+  syn keyword	freebasicMemory			__ALLOCATE __CALLOCATE __DEALLOCATE __REALLOCATE
+else
+  syn keyword	freebasicMemory			ALLOCATE CALLOCATE DEALLOCATE REALLOCATE
+  syn keyword	freebasicMemory			PEEK POKE CLEAR FB_MEMCOPY FB_MEMCOPYCLEAR FB_MEMMOVE SWAP SADD
+  syn keyword	freebasicMemory			FIELD FRE
+endif
+
+syn keyword	freebasicMisc			LET TO
+if s:lang == "qb"
+  syn keyword freebasicMisc			__OFFSETOF
+else
+  syn keyword freebasicMisc			OFFSETOF
+endif
+
+syn keyword	freebasicModularizing		CHAIN COMMON
+if s:lang == "fb"
+  syn keyword	freebasicModularizing		EXTERN
+  syn match	freebasicModularizing		"\<end\s\+extern\>"
+  syn keyword	freebasicModularizing		PROTECTED
+endif
+if s:lang == "qb"
+  syn keyword	freebasicModularizing		__EXPORT __IMPORT __DYLIBFREE __DYLIBLOAD __DYLIBSYMBOL
+else
+  syn keyword	freebasicModularizing		EXPORT IMPORT DYLIBFREE DYLIBLOAD DYLIBSYMBOL
+  syn keyword	freebasicModularizing		PRIVATE PUBLIC
+  syn keyword	freebasicModularizing		NAMESPACE
+  syn match	freebasicModularizing		"\<end\s\+namespace\>"
+endif
+
+if s:lang != "qb"
+  syn keyword	freebasicMultithreading		MUTEXCREATE MUTEXDESTROY MUTEXLOCK MUTEXUNLOCK THREADCREATE THREADWAIT
+  syn keyword	freebasicMultithreading		CONDBROADCAST CONDCREATE CONDDESTROY CONDSIGNAL CONDWAIT
+  syn keyword	freebasicMultithreading		THREADCALL THREADDETACH THREADSELF
+endif
+
+syn keyword	freebasicShell			CHDIR KILL NAME MKDIR RMDIR RUN SETENVIRON
+if s:lang == "qb"
+  syn keyword	freebasicShell			__CURDIR __DIR __EXEC __EXEPATH
+  syn match	freebasicString			"\<\%(command\|environ\)\$"
+else
+  " fbio.bi
+  syn keyword	freebasicShell			ISREDIRECTED
+  syn keyword	freebasicShell			CURDIR DIR EXEC EXEPATH
+  syn match	freebasicString			"\<\%(command\|environ\)\>\$\="
+endif
+
+syn keyword	freebasicEnviron		SHELL SYSTEM
+
+syn keyword	freebasicLoops			FOR LOOP WHILE WEND DO STEP UNTIL NEXT
+if s:lang == "qb"
+  syn keyword	freebasicLoops			__CONTINUE
+else
+  syn keyword	freebasicLoops			CONTINUE
+endif
+"
+"	File numbers
+"
+syn match	freebasicFilenumber		"#\d\+"
+syn match	freebasicFilenumber		"#\a[[:alpha:].]*[%&!#]\="
+
+syn match	freebasicMetacommand		"$\s*\%(dynamic\|static\)"
+syn match	freebasicMetacommand		"$\s*include\s*\%(once\)\=\s*:\s*'[^']\+'"
+syn match	freebasicMetacommand		'$\s*include\s*\%(once\)\=\s*:\s*"[^"]\+"'
+syn match	freebasicMetacommand		'$\s*lang\s*:\s*"[^"]\+"'
+"
+"	Intrinsic defines
+"
+syn keyword	freebasicPredefined		__DATE__ __DATE_ISO__
+syn keyword	freebasicPredefined		__FB_64BIT__ __FB_ARGC__ __FB_ARG_COUNT__ __FB_ARG_EXTRACT__ __FB_ARG_LEFTOF__
+syn keyword	freebasicPredefined		__FB_ARG_RIGHTOF__ __FB_ARGV__ __FB_ARM__ __FB_ASM__ __FB_BACKEND__
+syn keyword	freebasicPredefined		__FB_BIGENDIAN__ __FB_BUILD_DATE__ __FB_BUILD_DATE_ISO__ __FB_BUILD_SHA1__
+syn keyword	freebasicPredefined		__FB_CYGWIN__ __FB_DARWIN__ __FB_DEBUG__ __FB_DOS__ __FB_ERR__ __FB_EVAL__
+syn keyword	freebasicPredefined		__FB_FPMODE__ __FB_FPU__ __FB_FREEBSD__ __FB_GCC__ __FB_GUI__ __FB_JOIN__
+syn keyword	freebasicPredefined		__FB_LANG__ __FB_LINUX__ __FB_MAIN__ __FB_MIN_VERSION__ __FB_MT__ __FB_NETBSD__
+syn keyword	freebasicPredefined		__FB_OPENBSD__ __FB_OPTIMIZE__ __FB_OPTION_BYVAL__ __FB_OPTION_DYNAMIC__
+syn keyword	freebasicPredefined		__FB_OPTION_ESCAPE__ __FB_OPTION_EXPLICIT__ __FB_OPTION_GOSUB__
+syn keyword	freebasicPredefined		__FB_OPTION_PRIVATE__ __FB_OUT_DLL__ __FB_OUT_EXE__ __FB_OUT_LIB__ __FB_OUT_OBJ__
+syn keyword	freebasicPredefined		__FB_PCOS__ __FB_PPC__ __FB_QUOTE__ __FB_SIGNATURE__ __FB_SSE__ __FB_UNIQUEID__
+syn keyword	freebasicPredefined		__FB_UNIQUEID_POP__ __FB_UNIQUEID_PUSH__ __FB_UNIX__ __FB_UNQUOTE__
+syn keyword	freebasicPredefined		__FB_VECTORIZE__ __FB_VER_MAJOR__ __FB_VER_MINOR__ __FB_VER_PATCH__ __FB_VERSION__
+syn keyword	freebasicPredefined		__FB_WIN32__ __FB_X86__ __FB_XBOX__
+syn keyword	freebasicPredefined		__FILE__ __FILE_NQ__ __FUNCTION__ __FUNCTION_NQ__
+syn keyword	freebasicPredefined		__LINE__ __PATH__ __TIME__
+"
+"	Preprocessor directives
+"
+syn match	freebasicInclude		"#\s*\%(inclib\|include\%(\s\+once\)\=\|libpath\)\>"
+
+syn match	freebasicPreProcessor		"#\s*assert\>"
+syn match	freebasicPreProcessor		"#\s*cmdline\>"
+syn match	freebasicPreProcessor		"#\s*\%(define\|undef\)\>"
+syn match	freebasicPreProcessor		"#\s*\%(if\|ifdef\|ifndef\|else\|elseif\|endif\)\>"
+syn match	freebasicPreProcessor		"#\s*\%(macro\|endmacro\)\>"
+syn match	freebasicPreProcessor		"#\s*error\>"
+syn match	freebasicPreProcessor		"#\s*lang\>"
+syn match	freebasicPreProcessor		"#\s*line\>"
+syn match	freebasicPreProcessor		"#\s*pragma\%(\s\+reserve\)\=\>"
+syn match	freebasicPreProcessor		"#\s*\%(print\|dynamic\|static\)\>"
+syn keyword	freebasicPreProcessor		DEFINED
+
+syn keyword	freebasicString			LEN
+syn keyword	freebasicString			ASC
+" string.bi
+syn keyword	freebasicString			FORMAT
+syn keyword	freebasicString			VAL
+syn keyword	freebasicString			CVD CVI CVL CVS
+syn keyword	freebasicString			INSTR
+syn keyword	freebasicString			LSET RSET
+
+if s:lang == "qb"
+  syn match	freebasicString			"\<string\$\ze\s*("
+  syn match	freebasicString			"\<__wstring\ze\s*("
+  syn match	freebasicString			"\<space\$"
+  syn keyword	freebasicString			__WSPACE
+  syn match	freebasicString			"\<chr\$"
+  syn keyword	freebasicString			__WCHR
+  syn keyword	freebasicString			__WBIN __WHEX __WOCT __WSTR
+  syn match	freebasicString			"\<\%(bin\|hex\|oct\|str\)\$"
+  syn keyword	freebasicString			__VALLNG __VALINT __VALUINT __VALULNG
+  syn match	freebasicString			"\<\%(mkd\|mki\|mkl\|mks\)\$"
+  syn keyword	freebasicString			__MKLONGINT __MKSHORT
+  syn keyword	freebasicString			__CVLONGINT __CVSHORT
+  syn match	freebasicString			"\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\$"
+  syn keyword	freebasicString			__TRIM
+  syn keyword	freebasicString			__INSTRREV
+else
+  syn match	freebasicString			"\<string\$\=\ze\s*("
+  syn match	freebasicString			"\<wstring\ze\s*("
+  syn match	freebasicString			"\<space\>\$\="
+  syn keyword	freebasicString			WSPACE
+  syn match	freebasicString			"\<chr\>\$\="
+  syn keyword	freebasicString			WCHR
+  syn keyword	freebasicString			WBIN WHEX WOCT WSTR
+  syn match	freebasicString			"\<\%(bin\|hex\|oct\|str\)\>\$\="
+  syn keyword	freebasicString			VALLNG VALINT VALUINT VALULNG
+  syn match	freebasicString			"\<\%(mkd\|mki\|mkl\|mks\)\>\$\="
+  syn match	freebasicString			"\<\%(mklongint\|mkshort\)\>\$\="
+  syn keyword	freebasicString			CVLONGINT CVSHORT
+  syn match	freebasicString			"\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\>\$\="
+  syn match	freebasicString			"\<trim\>\$\="
+  syn keyword	freebasicString			INSTRREV
+endif
+
+syn keyword	freebasicTypeCasting		CDBL CINT CLNG CSNG
+if s:lang == "qb"
+  syn keyword	freebasicTypeCasting		__CAST __CBOOL __CBYTE __CLNGINT __CPTR __CSHORT __CSIGN __CYBTE __CUINT __CULNG
+  syn keyword	freebasicTypeCasting		__CULNGINT __CUNSG __CUSHORT
+else
+  syn keyword	freebasicTypeCasting		CAST CBOOL CBYTE CLNGINT CPTR CSHORT CSIGN CUBYTE CUINT CULNG CULNGINT CUNSG CUSHORT
+endif
+
+syn match	freebasicUserInput		"\<line\s\+input\>"
+syn keyword	freebasicUserInput		INKEY INPUT
+if s:lang == "qb"
+  syn keyword	freebasicUserInput		__GETJOYSTICK __GETKEY __GETMOUSE __MULTIKEY __SETMOUSE STICK STRIG
+else
+  syn keyword	freebasicUserInput		GETJOYSTICK GETKEY GETMOUSE MULTIKEY SETMOUSE
+endif
+"
+"	Operators
+"
+" TODO: make these context sensitive to remove the overlap of common operators
+"     : alpha operators should probably always be highlighted
+"     -- DJK 20/11/19
+if s:lang == "qb"
+  syn match	freebasicArithmeticOperator	"\<\%(MOD\|__SHL\|__SHR\)\>"
+else
+  syn match	freebasicArithmeticOperator	"\<\%(MOD\|SHL\|SHR\)\>"
+endif
+syn match	freebasicBitwiseOperator	"\<\%(AND\|EQV\|IMP\|NOT\|OR\|XOR\)\>" " freebaseLogical?
+if s:lang == "qb"
+  syn match	freebasicAssignmentOperator	"\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=\@=" " exclude trailing '='
+else
+  syn match	freebasicAssignmentOperator	"\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)=\@="
+endif
+syn match	freebasicShortcircuitOperator	"\<\%(ANDALSO\|ORELSE\)\>"
+if s:lang == "fb"
+  syn match	freebasicMemoryOperator		'\<\%(new\|delete\)\>'
+endif
+syn keyword	freebasicPointerOperator	STRPTR VARPTR
+if s:lang == "qb"
+  syn keyword	freebasicPointerOperator	__PROCPTR
+else
+  syn keyword	freebasicPointerOperator	PROCPTR
+endif
+syn match	freebasicTypeOperator		'\<is\>'
+syn match	freebasicTypeOperator		'\.' nextgroup=freebasicIdentifier skipwhite
+if s:lang == "fb"
+  syn match	freebasicTypeOperator		'->' nextgroup=freebasicIdentifier skipwhite
+endif
+
+if exists("freebasic_operators")
+  syn match	freebasicAssignmentOperator	"=>\=\|[-+&/\\*^]="
+  if s:lang == "qb"
+    syn match	freebasicAssignmentOperator	"\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=" " include trailing '='
+  else
+    syn match	freebasicAssignmentOperator	"\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)="
+  endif
+  syn match	freebasicArithmeticOperator	"[-+&/\\*^]"
+  " syn match	freebasicIndexingOperator	"[[\]()]" " FIXME
+  syn match	freebasicRelationalOperator	"=\|<>\|<=\|<\|>=\|>"
+  syn match	freebasicPreprocessorOperator	'\%(^\s*\)\@<!\%(##\|#\)\|[$!]"\@='
+  syn match	freebasicPointerOperator	'[@*]'
+  syn match	freebasicTypeOperator		'\.' nextgroup=freebasicIdentifier skipwhite
+  if s:lang == "fb"
+    syn match	freebasicTypeOperator		'->' nextgroup=freebasicIdentifier skipwhite
+  endif
+endif
+
+syn cluster	freebasicOperator		contains=freebasic.*Operator
 "
 "	Catch errors caused by wrong parenthesis
 "
-syn region	freebasicParen		transparent start='(' end=')' contains=ALLBUT,@freebasicParenGroup
-syn match	freebasicParenError	")"
-syn match	freebasicInParen	contained "[{}]"
-syn cluster	freebasicParenGroup	contains=freebasicParenError,freebasicSpecial,freebasicTodo,freebasicUserCont,freebasicUserLabel,freebasicBitField
+" syn region	freebasicParen		transparent start='(' end=')' contains=ALLBUT,@freebasicParenGroup
+" syn match	freebasicParenError	")"
+" syn match	freebasicInParen	contained "[{}]"
+" syn cluster	freebasicParenGroup	contains=freebasicParenError,freebasicSpecial,freebasicTodo,freebasicUserCont,freebasicUserLabel,freebasicBitField
 "
-"	Integer number, or floating point number without a dot and with "f".
+"	Integer number
 "
-syn region	freebasicHex			start="&h" end="\W"
-syn region	freebasicHexError		start="&h\x*[g-zG-Z]" end="\W"
-syn region	freebasicOctal			start="&o" end="\W"
-syn region	freebasicOctalError		start="&o[0-7]*[89a-zA-Z]" end="\W"
-syn region	freebasicBinary			start="&b" end="\W"
-syn region	freebasicBinaryError	start="&b[01]*[2-9a-zA-Z]" end="\W"
-syn match	freebasicInteger		"\<\d\+\(u\=l\=\|lu\|f\)\>"
+syn match	freebasicHexError	"&h\w*\>"
+syn match	freebasicOctalError	"&o\w*\>"
+syn match	freebasicBinaryError	"&b\w*\>"
+syn match	freebasicHex		"&h\x\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match	freebasicOctal		"&o\o\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match	freebasicBinary		"&b[10]\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match	freebasicInteger	"\<\d\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
 "
-"	Floating point number, with dot, optional exponent
+"	Floating point
+"	See: https://www.freebasic.net/forum/viewtopic.php?t=20323
 "
-syn match	freebasicFloat		"\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"	Floating point number, with dot, optional exponent, optional suffix
 "
-"	Floating point number, starting with a dot, optional exponent
+syn match	freebasicFloat		"\<\d\+\.\d*\%([de][-+]\=\d*\)\=[f!#]\="
 "
-syn match	freebasicFloat		"\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"	Floating point number, starting with a dot, optional exponent, optional suffix
 "
-"	Floating point number, without dot, with exponent
+syn match	freebasicFloat		"\.\d\+\%([de][-+]\=\d*\)\=[f!#]\="
 "
-syn match	freebasicFloat		"\<\d\+e[-+]\=\d\+[fl]\=\>"
+"	Floating point number, without dot, with optional exponent, optional suffix
 "
-"	Octal number
+syn match	freebasicFloat		"\<\d\+\%([de][-+]\=\d*\)[f!#]\="
 "
-syn case match
-syn match	freebasicOctal2			"\<0\o*\>"
-syn match	freebasicOctal2Error	"\<0\o*[89a-zA-Z]"
+"	Floating point number, without dot, without exponent, with suffix
 "
-"	String and Character contstants
-"
-syn region	freebasicString		start='"' end='"' contains=freebasicSpecial,freebasicTodo
-syn region	freebasicString		start="'" end="'" contains=freebasicSpecial,freebasicTodo
-"
-"	Comments
-"
-syn match	freebasicSpecial	contained "\\\\."
-syn region	freebasicComment	start="^rem" end="$" contains=freebasicSpecial,freebasicTodo
-syn region	freebasicComment	start=":\s*rem" end="$" contains=freebasicSpecial,freebasicTodo
-syn region	freebasicComment	start="\s*'" end="$" contains=freebasicSpecial,freebasicTodo
-syn region	freebasicComment	start="^'" end="$" contains=freebasicSpecial,freebasicTodo
-"
-"	Now do the comments and labels
-"
-syn match	freebasicLabel		"^\d"
-syn match	freebasicLabel		"\<^\w+:\>"
-syn region	freebasicLineNumber	start="^\d" end="\s"
+syn match	freebasicFloat		"\<\d\+[f!#]"
 "
 "	Create the clusters
 "
-syn cluster	freebasicNumber		contains=freebasicHex,freebasicOctal,freebasicOctal2,freebasicBinary,freebasicInteger,freebasicFloat
-syn cluster	freebasicError		contains=freebasicHexError,freebasicOctalError,freebasicOctal2,freebasicBinary
+syn cluster	freebasicNumber		contains=freebasicHex,freebasicOctal,freebasicBinary,freebasicInteger,freebasicFloat
+syn cluster	freebasicNumberError	contains=freebasicHexError,freebasicOctalError,freebasicBinaryError
 "
-"	Used with OPEN statement
+"	Booleans
 "
-syn match	freebasicFilenumber		"#\d\+"
-syn match	freebasicMathOperator	"[\+\-\=\|\*\/\>\<\%\()[\]]" contains=freebasicParen
+if s:lang != "qb"
+  syn keyword	freebasicBoolean	TRUE FALSE
+endif
+"
+"
+"	String and escape sequences
+"
+syn match	freebasicSpecial	contained "\\."
+syn match	freebasicSpecial	contained "\\\d\{1,3}"
+syn match	freebasicSpecial	contained "\\&h\x\{1,2}"
+syn match	freebasicSpecial	contained "\\&o\o\{1,3}"
+syn match	freebasicSpecial	contained "\\&b[01]\{1,8}"
+syn match	freebasicSpecial	contained "\\u\x\{1,4}"
+syn region	freebasicString		start='"'     end='"' " TODO: Toggle contains on Option Escape in fblite and qb? -- DJK 20/11/19
+syn region	freebasicString		start='!\zs"' end='"' contains=freebasicSpecial
+syn region	freebasicString		start='$\zs"' end='"'
+"
+"	Line labels
+"
+if s:lang =~# '\<\%(qb\|fblite\)\>'
+  syn match	freebasicLineLabel	"^\s*\zs\h\%(\w\|\.\)*\ze\s*:"
+else
+  syn match	freebasicLineLabel	"^\s*\zs\h\w*\ze\s*:"
+endif
+syn match	freebasicLineNumber	"^\s*\zs\d\+"
+"
+"	Line continuations
+"
+" syn match	freebasicLineContinuation	"\<_\>"	nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
+syn keyword	freebasicLineContinuation	_	nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
+syn match	freebasicPostLineContinuation	".*"	contained
+"
+"
+" Type suffixes
+if exists("freebasic_type_suffixes") && s:lang =~# '\<\%(qb\|fblite\)\>'
+  syn match freebasicTypeSuffix "\h\%(\w\|.\)*\zs[$%&!#]"
+endif
+"
+"	Comments
+"
+syn keyword	freebasicTodo			TODO FIXME XXX NOTE      contained
+syn region	freebasicComment		start="\<rem\>" end="$"  contains=freebasicTodo,@Spell,freebasicMetacommand
+syn region	freebasicComment		start="'"	end="$"  contains=freebasicTodo,@Spell,freebasicMetacommand
+syn region	freebasicDoubleComment		start="''"	end="$"  contains=freebasicTodo,@Spell
+
+if !exists("freebasic_no_comment_fold")
+  syn region	freebasicMultilineComment	start="/'"	end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment fold keepend extend
+  syn region	freebasicMultilineComment2	start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=freebasicComment,freebasicDoubleComment keepend fold
+else
+  syn region	freebasicMultilineComment	start="/'"	end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment
+endif
+
+syn case match
+
+syn sync linebreaks=1
+
 "
 "	The default methods for highlighting.  Can be overridden later
 "
 hi def link freebasicArrays		StorageClass
+hi def link freebasicAsm		Special
 hi def link freebasicBitManipulation	Operator
-hi def link freebasicCompilerSwitches	PreCondit
+hi def link freebasicBoolean		Boolean
+if s:lang == "fb"
+  hi def link freebasicCompilerSwitches	freebasicUnsupportedError
+else
+  hi def link freebasicCompilerSwitches	PreCondit
+endif
 hi def link freebasicConsole		Special
+hi def link freebasicData		Special
 hi def link freebasicDataTypes		Type
 hi def link freebasicDateTime		Type
 hi def link freebasicDebug		Special
 hi def link freebasicErrorHandling	Special
+hi def link freebasicFilenumber		Special
 hi def link freebasicFiles		Special
 hi def link freebasicFunctions		Function
 hi def link freebasicGraphics		Function
 hi def link freebasicHardware		Special
-hi def link freebasicLogical		Conditional
+hi def link freebasicLoops		Repeat
 hi def link freebasicMath		Function
+if s:lang == "fb"
+  hi def link freebasicMetacommand	freebasicUnsupportedError
+else
+  hi def link freebasicMetacommand	SpecialComment
+endif
 hi def link freebasicMemory		Function
 hi def link freebasicMisc		Special
 hi def link freebasicModularizing	Special
@@ -240,18 +620,55 @@
 hi def link freebasicTypeCasting	Type
 hi def link freebasicUserInput		Statement
 hi def link freebasicComment		Comment
+hi def link freebasicDoubleComment	Comment
+hi def link freebasicMultilineComment	Comment
 hi def link freebasicConditional	Conditional
 hi def link freebasicError		Error
 hi def link freebasicIdentifier		Identifier
 hi def link freebasicInclude		Include
 hi def link freebasicGenericFunction	Function
-hi def link freebasicLabel		Label
-hi def link freebasicLineNumber		Label
+hi def link freebasicLineContinuation	Special
+hi def link freebasicLineLabel		LineNr
+if s:lang == "fb"
+  hi def link freebasicLineNumber	freebasicUnsupportedError
+else
+  hi def link freebasicLineNumber	LineNr
+endif
 hi def link freebasicMathOperator	Operator
-hi def link freebasicNumber		Number
+
+hi def link freebasicHex		Number
+hi def link freebasicOctal		Number
+hi def link freebasicBinary		Number
+hi def link freebasicInteger		Number
+hi def link freebasicFloat		Float
+
+hi def link freebasicHexError		Error
+hi def link freebasicOctalError		Error
+hi def link freebasicBinaryError	Error
+
+hi def link freebasicAssignmentOperator		Operator
+hi def link freebasicArithmeticOperator		Operator
+hi def link freebasicIndexingOperator		Operator
+hi def link freebasicRelationalOperator		Operator
+hi def link freebasicBitwiseOperator		Operator
+hi def link freebasicShortcircuitOperator	Operator
+hi def link freebasicPreprocessorOperator	Operator
+hi def link freebasicPointerOperator		Operator
+if exists("freebasic_operators")
+  hi def link freebasicTypeOperator		Operator
+endif
+hi def link freebasicMemoryOperator		Operator
+
+hi def link freebasicSpaceError			Error
+
 hi def link freebasicSpecial		Special
 hi def link freebasicTodo		Todo
 
+hi def link freebasicUnsupported	freebasicUnsupportedError
+hi def link freebasicUnsupportedError	Error
+
+unlet s:lang
+
 let b:current_syntax = "freebasic"
 
-" vim: ts=8
+" vim: ts=8 tw=132 fdm=marker