neovim/runtime/syntax/qb64.vim

410 lines
7.8 KiB
VimL
Raw Normal View History

" 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: