1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
|
" 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:
|