forked from aniani/vim
		
	
		
			
	
	
		
			410 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			410 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim syntax file | ||
|  | " Language:	QB64 | ||
|  | " Maintainer:	Doug Kearns <dougkearns@gmail.com> | ||
|  | " Last Change:	2022 Jan 21 | ||
|  | 
 | ||
|  | " Prelude {{{1 | ||
|  | if exists("b:current_syntax") | ||
|  |   finish | ||
|  | endif | ||
|  | 
 | ||
|  | let s:cpo_save = &cpo | ||
|  | set cpo&vim | ||
|  | 
 | ||
|  | " syn iskeyword set after sourcing of basic.vim | ||
|  | 
 | ||
|  | syn case ignore | ||
|  | 
 | ||
|  | let s:prefix = search('\c^\s*$NOPREFIX\>', 'n') ? '_\=' : '_' | ||
|  | 
 | ||
|  | " Statements {{{1 | ||
|  | 
 | ||
|  | let s:statements =<< trim EOL " {{{2 | ||
|  |   acceptfiledrop | ||
|  |   allowfullscreen | ||
|  |   assert | ||
|  |   console | ||
|  |   consolecursor | ||
|  |   consolefont | ||
|  |   consoletitle | ||
|  |   continue | ||
|  |   copypalette | ||
|  |   define | ||
|  |   delay | ||
|  |   depthbuffer | ||
|  |   displayorder | ||
|  |   dontblend | ||
|  |   echo | ||
|  |   exit\s\+\%(select\|case\) | ||
|  |   finishdrop | ||
|  |   freefont | ||
|  |   freeimage | ||
|  |   icon | ||
|  |   keyclear | ||
|  |   limit | ||
|  |   maptriangle | ||
|  |   memcopy | ||
|  |   memfill | ||
|  |   memfree | ||
|  |   memput | ||
|  |   mousehide | ||
|  |   mousemove | ||
|  |   mouseshow | ||
|  |   printimage | ||
|  |   printstring | ||
|  |   putimage | ||
|  |   screenclick | ||
|  |   screenhide | ||
|  |   screenmove | ||
|  |   screenprint | ||
|  |   screenshow | ||
|  |   setalpha | ||
|  |   sndbal | ||
|  |   sndclose | ||
|  |   sndlimit | ||
|  |   sndloop | ||
|  |   sndpause | ||
|  |   sndplay | ||
|  |   sndplaycopy | ||
|  |   sndplayfile | ||
|  |   sndraw | ||
|  |   sndrawdone | ||
|  |   sndsetpos | ||
|  |   sndstop | ||
|  |   sndvol | ||
|  |   title | ||
|  | EOL | ||
|  | " }}} | ||
|  | 
 | ||
|  | for s in s:statements | ||
|  |   exe 'syn match qb64Statement "\<' .. s:prefix .. s .. '\>" contained contains=qb64Underscore' | ||
|  | endfor | ||
|  | 
 | ||
|  | " Functions {{{1 | ||
|  | 
 | ||
|  | let s:functions =<< trim EOL " {{{2 | ||
|  |   acos | ||
|  |   acosh | ||
|  |   alpha | ||
|  |   alpha32 | ||
|  |   arccot | ||
|  |   arccsc | ||
|  |   arcsec | ||
|  |   asin | ||
|  |   asinh | ||
|  |   atan2 | ||
|  |   atanh | ||
|  |   axis | ||
|  |   backgroundcolor | ||
|  |   blue | ||
|  |   blue32 | ||
|  |   button | ||
|  |   buttonchange | ||
|  |   ceil | ||
|  |   cinp | ||
|  |   commandcount | ||
|  |   connected | ||
|  |   connectionaddress | ||
|  |   connectionaddress$ | ||
|  |   consoleinput | ||
|  |   copyimage | ||
|  |   cot | ||
|  |   coth | ||
|  |   cosh | ||
|  |   csc | ||
|  |   csch | ||
|  |   cv | ||
|  |   cwd$ | ||
|  |   d2g | ||
|  |   d2r | ||
|  |   defaultcolor | ||
|  |   deflate$ | ||
|  |   desktopheight | ||
|  |   desktopwidth | ||
|  |   device$ | ||
|  |   deviceinput | ||
|  |   devices | ||
|  |   dir$ | ||
|  |   direxists | ||
|  |   droppedfile | ||
|  |   droppedfile$ | ||
|  |   errorline | ||
|  |   errormessage$ | ||
|  |   exit | ||
|  |   fileexists | ||
|  |   fontheight | ||
|  |   fontwidth | ||
|  |   freetimer | ||
|  |   g2d | ||
|  |   g2r | ||
|  |   green | ||
|  |   green32 | ||
|  |   height | ||
|  |   hypot | ||
|  |   inclerrorfile$ | ||
|  |   inclerrorline | ||
|  |   inflate$ | ||
|  |   instrrev | ||
|  |   keyhit | ||
|  |   keydown | ||
|  |   lastaxis | ||
|  |   lastbutton | ||
|  |   lastwheel | ||
|  |   loadfont | ||
|  |   loadimage | ||
|  |   mem | ||
|  |   memelement | ||
|  |   memexists | ||
|  |   memimage | ||
|  |   memnew | ||
|  |   memsound | ||
|  |   mk$ | ||
|  |   mousebutton | ||
|  |   mouseinput | ||
|  |   mousemovementx | ||
|  |   mousemovementy | ||
|  |   mousepipeopen | ||
|  |   mousewheel | ||
|  |   mousex | ||
|  |   mousey | ||
|  |   newimage | ||
|  |   offset | ||
|  |   openclient | ||
|  |   os$ | ||
|  |   pi | ||
|  |   pixelsize | ||
|  |   printwidth | ||
|  |   r2d | ||
|  |   r2g | ||
|  |   red | ||
|  |   red32 | ||
|  |   readbit | ||
|  |   resetbit | ||
|  |   resizeheight | ||
|  |   resizewidth | ||
|  |   rgb | ||
|  |   rgb32 | ||
|  |   rgba | ||
|  |   rgba32 | ||
|  |   round | ||
|  |   sec | ||
|  |   sech | ||
|  |   screenexists | ||
|  |   screenimage | ||
|  |   screenx | ||
|  |   screeny | ||
|  |   setbit | ||
|  |   shellhide | ||
|  |   shl | ||
|  |   shr | ||
|  |   sinh | ||
|  |   sndcopy | ||
|  |   sndgetpos | ||
|  |   sndlen | ||
|  |   sndopen | ||
|  |   sndopenraw | ||
|  |   sndpaused | ||
|  |   sndplaying | ||
|  |   sndrate | ||
|  |   sndrawlen | ||
|  |   startdir$ | ||
|  |   strcmp | ||
|  |   stricmp | ||
|  |   tanh | ||
|  |   title$ | ||
|  |   togglebit | ||
|  |   totaldroppedfiles | ||
|  |   trim$ | ||
|  |   wheel | ||
|  |   width | ||
|  |   windowhandle | ||
|  |   windowhasfocus | ||
|  | EOL | ||
|  | " }}} | ||
|  | 
 | ||
|  | for f in s:functions | ||
|  |   exe 'syn match qb64Function "\<' .. s:prefix .. f .. '\>" contains=qb64Underscore' | ||
|  | endfor | ||
|  | 
 | ||
|  | " Functions and statements (same name) {{{1 | ||
|  | 
 | ||
|  | let s:common =<< trim EOL " {{{2 | ||
|  |   autodisplay | ||
|  |   blend | ||
|  |   blink | ||
|  |   capslock | ||
|  |   clearcolor | ||
|  |   clipboard$ | ||
|  |   clipboardimage | ||
|  |   controlchr | ||
|  |   dest | ||
|  |   display | ||
|  |   font | ||
|  |   fullscreen | ||
|  |   mapunicode | ||
|  |   memget | ||
|  |   numlock | ||
|  |   palettecolor | ||
|  |   printmode | ||
|  |   resize | ||
|  |   screenicon | ||
|  |   scrolllock | ||
|  |   source | ||
|  | EOL | ||
|  | " }}} | ||
|  | 
 | ||
|  | for c in s:common | ||
|  |   exe 'syn match qb64Statement "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore contained' | ||
|  |   exe 'syn match qb64Function  "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore' | ||
|  | endfor | ||
|  | 
 | ||
|  | " Keywords {{{1 | ||
|  | 
 | ||
|  | " Non-prefixed keywords {{{2 | ||
|  | " TIMER FREE | ||
|  | " _DEPTH_BUFFER LOCK | ||
|  | syn keyword qb64Keyword free lock | ||
|  | 
 | ||
|  | let s:keywords  =<< trim EOL " {{{2 | ||
|  |   all | ||
|  |   anticlockwise | ||
|  |   behind | ||
|  |   clear | ||
|  |   clip | ||
|  |   console | ||
|  |   dontwait | ||
|  |   explicit | ||
|  |   explicitarray | ||
|  |   fillbackground | ||
|  |   hardware | ||
|  |   hardware1 | ||
|  |   hide | ||
|  |   keepbackground | ||
|  |   middle | ||
|  |   none | ||
|  |   off | ||
|  |   only | ||
|  |   onlybackground | ||
|  |   ontop | ||
|  |   openconnection | ||
|  |   openhost | ||
|  |   preserve | ||
|  |   seamless | ||
|  |   smooth | ||
|  |   smoothshrunk | ||
|  |   smoothstretched | ||
|  |   software | ||
|  |   squarepixels | ||
|  |   stretch | ||
|  |   toggle | ||
|  | EOL | ||
|  | " }}} | ||
|  | 
 | ||
|  | for k in s:keywords | ||
|  |   exe 'syn match qb64Keyword "\<' .. s:prefix .. k .. '\>" contains=qb64Underscore' | ||
|  | endfor | ||
|  | 
 | ||
|  | syn match qb64Underscore "\<_" contained conceal transparent | ||
|  | 
 | ||
|  | " Source QuickBASIC syntax {{{1 | ||
|  | runtime! syntax/basic.vim | ||
|  | 
 | ||
|  | " add after the BASIC syntax file is sourced so cluster already exists | ||
|  | syn cluster basicStatements	add=qb64Statement,qb64Metacommand,qb64IfMetacommand | ||
|  | syn cluster basicLineIdentifier add=qb64LineLabel | ||
|  | syn cluster qb64NotTop		contains=@basicNotTop,qb64Metavariable | ||
|  | 
 | ||
|  | syn iskeyword @,48-57,.,_,!,#,$,%,&,` | ||
|  | 
 | ||
|  | " Unsupported QuickBASIC features {{{1 | ||
|  | " TODO: add linux only missing features | ||
|  | syn keyword qb64Unsupported alias any byval calls cdecl erdev erdev$ fileattr | ||
|  | syn keyword qb64Unsupported fre ioctl ioctl$ pen play setmem signal uevent | ||
|  | syn keyword qb64Unsupported tron troff | ||
|  | syn match   qb64Unsupported "\<declare\%(\s\+\%(sub\|function\)\>\)\@=" | ||
|  | syn match   qb64Unsupported "\<\%(date\|time\)$\ze\s*=" " statements only | ||
|  | syn match   qb64Unsupported "\<def\zs\s\+FN" | ||
|  | syn match   qb64Unsupported "\<\%(exit\|end\)\s\+def\>" | ||
|  | syn match   qb64Unsupported "\<width\s\+lprint\>" | ||
|  | 
 | ||
|  | " Types {{{1 | ||
|  | syn keyword qb64Type _BIT _BYTE _FLOAT _INTEGER64 _MEM _OFFSET _UNSIGNED | ||
|  | 
 | ||
|  | " Type suffixes {{{1 | ||
|  | if exists("basic_type_suffixes") | ||
|  |   " TODO: handle leading word boundary and __+ prefix | ||
|  |   syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=`\%(\d\+\)\=" | ||
|  |   syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=\%(%\|%%\|&\|&&\|%&\)" | ||
|  |   syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\%(!\|##\|#\)" | ||
|  |   syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=$\%(\d\+\)\=" | ||
|  | endif | ||
|  | 
 | ||
|  | " Numbers {{{1 | ||
|  | 
 | ||
|  | " Integers | ||
|  | syn match qb64Number "-\=&b[01]\+&\>\=" | ||
|  | 
 | ||
|  | syn match qb64Number "-\=\<[01]\~\=`\>" | ||
|  | syn match qb64Number "-\=\<\d\+`\d\+\>" | ||
|  | 
 | ||
|  | syn match qb64Number "-\=\<\d\+\%(%%\|&&\|%&\)\>" | ||
|  | syn match qb64Number  "\<\d\+\~\%(%%\|&&\|%&\)\>" | ||
|  | 
 | ||
|  | syn match qb64Number "-\=\<&b[01]\+\%(%%\|&&\|%&\)\>" | ||
|  | syn match qb64Number  "\<&b[01]\+\~\%(%%\|&&\|%&\)\>" | ||
|  | 
 | ||
|  | syn match qb64Number "-\=\<&o\=\o\+\%(%%\|&&\|%&\)\>" | ||
|  | syn match qb64Number  "\<&o\=\o\+\~\%(%%\|&&\|%&\)\>" | ||
|  | 
 | ||
|  | syn match qb64Number "-\=\<&h\x\+\%(%%\|&&\|%&\)\>" | ||
|  | syn match qb64Number  "\<&h\x\+\~\%(%%\|&&\|%&\)\>" | ||
|  | 
 | ||
|  | " Floats | ||
|  | syn match qb64Float "-\=\<\d\+\.\=\d*##\>" | ||
|  | syn match qb64Float "-\=\<\.\d\+##\>" | ||
|  | 
 | ||
|  | " Line numbers and labels {{{1 | ||
|  | syn match qb64LineLabel  "\%(_\{2,}\)\=\a[[:alnum:]._]*[[:alnum:]]\ze\s*:" nextgroup=@basicStatements skipwhite contained | ||
|  | 
 | ||
|  | " Metacommands {{{1 | ||
|  | syn match qb64Metacommand contained "$NOPREFIX\>" | ||
|  | syn match qb64Metacommand contained "$ASSERTS\%(:CONSOLE\)\=\>" | ||
|  | syn match qb64Metacommand contained "$CHECKING:\%(ON\|OFF\)\>" | ||
|  | syn match qb64Metacommand contained "$COLOR:\%(0\|32\)\>" | ||
|  | syn match qb64Metacommand contained "$CONSOLE\%(:ONLY\)\=\>" | ||
|  | syn match qb64Metacommand contained "$EXEICON\s*:\s*'[^']\+'" | ||
|  | syn match qb64Metacommand contained "$ERROR\>" | ||
|  | syn match qb64Metacommand contained "$LET\>" | ||
|  | syn match qb64Metacommand contained "$RESIZE:\%(ON\|OFF\|STRETCH\|SMOOTH\)\>" | ||
|  | syn match qb64Metacommand contained "$SCREEN\%(HIDE\|SHOW\)\>" | ||
|  | syn match qb64Metacommand contained "$VERSIONINFO\s*:.*" | ||
|  | syn match qb64Metacommand contained "$VIRTUALKEYBOARD:\%(ON\|OFF\)\>" | ||
|  | 
 | ||
|  | syn region qb64IfMetacommand contained matchgroup=qb64Metacommand start="$\%(IF\|ELSEIF\)\>" end="\<THEN\>" oneline transparent contains=qb64Metavariable | ||
|  | syn match  qb64Metacommand contained "$\%(ELSE\|END\s*IF\)\>" | ||
|  | 
 | ||
|  | syn keyword qb64Metavariable contained defined undefined | ||
|  | syn keyword qb64Metavariable contained windows win linux mac maxosx | ||
|  | syn keyword qb64Metavariable contained 32bit 64bit version | ||
|  | 
 | ||
|  | " Default Highlighting {{{1 | ||
|  | hi def link qb64Float	      basicFloat | ||
|  | hi def link qb64Function      Function | ||
|  | hi def link qb64Keyword       Keyword | ||
|  | hi def link qb64LineLabel     basicLineLabel | ||
|  | hi def link qb64Metacommand   PreProc | ||
|  | hi def link qb64Metavariable  Identifier | ||
|  | hi def link qb64Number	      basicNumber | ||
|  | hi def link qb64Statement     Statement | ||
|  | hi def link qb64TypeSuffix    basicTypeSuffix | ||
|  | hi def link qb64Type	      Type | ||
|  | hi def link qb64Unsupported   Error | ||
|  | 
 | ||
|  | " Postscript {{{1 | ||
|  | let b:current_syntax = "qb64" | ||
|  | 
 | ||
|  | let &cpo = s:cpo_save | ||
|  | unlet s:cpo_save | ||
|  | 
 | ||
|  | " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: |