Bram Moolenaar | f10911e | 2022-01-29 22:20:48 +0000 | [diff] [blame] | 1 | " Vim syntax file |
| 2 | " Language: QB64 |
| 3 | " Maintainer: Doug Kearns <dougkearns@gmail.com> |
| 4 | " Last Change: 2022 Jan 21 |
| 5 | |
| 6 | " Prelude {{{1 |
| 7 | if exists("b:current_syntax") |
| 8 | finish |
| 9 | endif |
| 10 | |
| 11 | let s:cpo_save = &cpo |
| 12 | set cpo&vim |
| 13 | |
| 14 | " syn iskeyword set after sourcing of basic.vim |
| 15 | |
| 16 | syn case ignore |
| 17 | |
| 18 | let s:prefix = search('\c^\s*$NOPREFIX\>', 'n') ? '_\=' : '_' |
| 19 | |
| 20 | " Statements {{{1 |
| 21 | |
| 22 | let s:statements =<< trim EOL " {{{2 |
| 23 | acceptfiledrop |
| 24 | allowfullscreen |
| 25 | assert |
| 26 | console |
| 27 | consolecursor |
| 28 | consolefont |
| 29 | consoletitle |
| 30 | continue |
| 31 | copypalette |
| 32 | define |
| 33 | delay |
| 34 | depthbuffer |
| 35 | displayorder |
| 36 | dontblend |
| 37 | echo |
| 38 | exit\s\+\%(select\|case\) |
| 39 | finishdrop |
| 40 | freefont |
| 41 | freeimage |
| 42 | icon |
| 43 | keyclear |
| 44 | limit |
| 45 | maptriangle |
| 46 | memcopy |
| 47 | memfill |
| 48 | memfree |
| 49 | memput |
| 50 | mousehide |
| 51 | mousemove |
| 52 | mouseshow |
| 53 | printimage |
| 54 | printstring |
| 55 | putimage |
| 56 | screenclick |
| 57 | screenhide |
| 58 | screenmove |
| 59 | screenprint |
| 60 | screenshow |
| 61 | setalpha |
| 62 | sndbal |
| 63 | sndclose |
| 64 | sndlimit |
| 65 | sndloop |
| 66 | sndpause |
| 67 | sndplay |
| 68 | sndplaycopy |
| 69 | sndplayfile |
| 70 | sndraw |
| 71 | sndrawdone |
| 72 | sndsetpos |
| 73 | sndstop |
| 74 | sndvol |
| 75 | title |
| 76 | EOL |
| 77 | " }}} |
| 78 | |
| 79 | for s in s:statements |
| 80 | exe 'syn match qb64Statement "\<' .. s:prefix .. s .. '\>" contained contains=qb64Underscore' |
| 81 | endfor |
| 82 | |
| 83 | " Functions {{{1 |
| 84 | |
| 85 | let s:functions =<< trim EOL " {{{2 |
| 86 | acos |
| 87 | acosh |
| 88 | alpha |
| 89 | alpha32 |
| 90 | arccot |
| 91 | arccsc |
| 92 | arcsec |
| 93 | asin |
| 94 | asinh |
| 95 | atan2 |
| 96 | atanh |
| 97 | axis |
| 98 | backgroundcolor |
| 99 | blue |
| 100 | blue32 |
| 101 | button |
| 102 | buttonchange |
| 103 | ceil |
| 104 | cinp |
| 105 | commandcount |
| 106 | connected |
| 107 | connectionaddress |
| 108 | connectionaddress$ |
| 109 | consoleinput |
| 110 | copyimage |
| 111 | cot |
| 112 | coth |
| 113 | cosh |
| 114 | csc |
| 115 | csch |
| 116 | cv |
| 117 | cwd$ |
| 118 | d2g |
| 119 | d2r |
| 120 | defaultcolor |
| 121 | deflate$ |
| 122 | desktopheight |
| 123 | desktopwidth |
| 124 | device$ |
| 125 | deviceinput |
| 126 | devices |
| 127 | dir$ |
| 128 | direxists |
| 129 | droppedfile |
| 130 | droppedfile$ |
| 131 | errorline |
| 132 | errormessage$ |
| 133 | exit |
| 134 | fileexists |
| 135 | fontheight |
| 136 | fontwidth |
| 137 | freetimer |
| 138 | g2d |
| 139 | g2r |
| 140 | green |
| 141 | green32 |
| 142 | height |
| 143 | hypot |
| 144 | inclerrorfile$ |
| 145 | inclerrorline |
| 146 | inflate$ |
| 147 | instrrev |
| 148 | keyhit |
| 149 | keydown |
| 150 | lastaxis |
| 151 | lastbutton |
| 152 | lastwheel |
| 153 | loadfont |
| 154 | loadimage |
| 155 | mem |
| 156 | memelement |
| 157 | memexists |
| 158 | memimage |
| 159 | memnew |
| 160 | memsound |
| 161 | mk$ |
| 162 | mousebutton |
| 163 | mouseinput |
| 164 | mousemovementx |
| 165 | mousemovementy |
| 166 | mousepipeopen |
| 167 | mousewheel |
| 168 | mousex |
| 169 | mousey |
| 170 | newimage |
| 171 | offset |
| 172 | openclient |
| 173 | os$ |
| 174 | pi |
| 175 | pixelsize |
| 176 | printwidth |
| 177 | r2d |
| 178 | r2g |
| 179 | red |
| 180 | red32 |
| 181 | readbit |
| 182 | resetbit |
| 183 | resizeheight |
| 184 | resizewidth |
| 185 | rgb |
| 186 | rgb32 |
| 187 | rgba |
| 188 | rgba32 |
| 189 | round |
| 190 | sec |
| 191 | sech |
| 192 | screenexists |
| 193 | screenimage |
| 194 | screenx |
| 195 | screeny |
| 196 | setbit |
| 197 | shellhide |
| 198 | shl |
| 199 | shr |
| 200 | sinh |
| 201 | sndcopy |
| 202 | sndgetpos |
| 203 | sndlen |
| 204 | sndopen |
| 205 | sndopenraw |
| 206 | sndpaused |
| 207 | sndplaying |
| 208 | sndrate |
| 209 | sndrawlen |
| 210 | startdir$ |
| 211 | strcmp |
| 212 | stricmp |
| 213 | tanh |
| 214 | title$ |
| 215 | togglebit |
| 216 | totaldroppedfiles |
| 217 | trim$ |
| 218 | wheel |
| 219 | width |
| 220 | windowhandle |
| 221 | windowhasfocus |
| 222 | EOL |
| 223 | " }}} |
| 224 | |
| 225 | for f in s:functions |
| 226 | exe 'syn match qb64Function "\<' .. s:prefix .. f .. '\>" contains=qb64Underscore' |
| 227 | endfor |
| 228 | |
| 229 | " Functions and statements (same name) {{{1 |
| 230 | |
| 231 | let s:common =<< trim EOL " {{{2 |
| 232 | autodisplay |
| 233 | blend |
| 234 | blink |
| 235 | capslock |
| 236 | clearcolor |
| 237 | clipboard$ |
| 238 | clipboardimage |
| 239 | controlchr |
| 240 | dest |
| 241 | display |
| 242 | font |
| 243 | fullscreen |
| 244 | mapunicode |
| 245 | memget |
| 246 | numlock |
| 247 | palettecolor |
| 248 | printmode |
| 249 | resize |
| 250 | screenicon |
| 251 | scrolllock |
| 252 | source |
| 253 | EOL |
| 254 | " }}} |
| 255 | |
| 256 | for c in s:common |
| 257 | exe 'syn match qb64Statement "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore contained' |
| 258 | exe 'syn match qb64Function "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore' |
| 259 | endfor |
| 260 | |
| 261 | " Keywords {{{1 |
| 262 | |
| 263 | " Non-prefixed keywords {{{2 |
| 264 | " TIMER FREE |
| 265 | " _DEPTH_BUFFER LOCK |
| 266 | syn keyword qb64Keyword free lock |
| 267 | |
| 268 | let s:keywords =<< trim EOL " {{{2 |
| 269 | all |
| 270 | anticlockwise |
| 271 | behind |
| 272 | clear |
| 273 | clip |
| 274 | console |
| 275 | dontwait |
| 276 | explicit |
| 277 | explicitarray |
| 278 | fillbackground |
| 279 | hardware |
| 280 | hardware1 |
| 281 | hide |
| 282 | keepbackground |
| 283 | middle |
| 284 | none |
| 285 | off |
| 286 | only |
| 287 | onlybackground |
| 288 | ontop |
| 289 | openconnection |
| 290 | openhost |
| 291 | preserve |
| 292 | seamless |
| 293 | smooth |
| 294 | smoothshrunk |
| 295 | smoothstretched |
| 296 | software |
| 297 | squarepixels |
| 298 | stretch |
| 299 | toggle |
| 300 | EOL |
| 301 | " }}} |
| 302 | |
| 303 | for k in s:keywords |
| 304 | exe 'syn match qb64Keyword "\<' .. s:prefix .. k .. '\>" contains=qb64Underscore' |
| 305 | endfor |
| 306 | |
| 307 | syn match qb64Underscore "\<_" contained conceal transparent |
| 308 | |
| 309 | " Source QuickBASIC syntax {{{1 |
| 310 | runtime! syntax/basic.vim |
| 311 | |
| 312 | " add after the BASIC syntax file is sourced so cluster already exists |
| 313 | syn cluster basicStatements add=qb64Statement,qb64Metacommand,qb64IfMetacommand |
| 314 | syn cluster basicLineIdentifier add=qb64LineLabel |
| 315 | syn cluster qb64NotTop contains=@basicNotTop,qb64Metavariable |
| 316 | |
| 317 | syn iskeyword @,48-57,.,_,!,#,$,%,&,` |
| 318 | |
| 319 | " Unsupported QuickBASIC features {{{1 |
| 320 | " TODO: add linux only missing features |
| 321 | syn keyword qb64Unsupported alias any byval calls cdecl erdev erdev$ fileattr |
| 322 | syn keyword qb64Unsupported fre ioctl ioctl$ pen play setmem signal uevent |
| 323 | syn keyword qb64Unsupported tron troff |
| 324 | syn match qb64Unsupported "\<declare\%(\s\+\%(sub\|function\)\>\)\@=" |
| 325 | syn match qb64Unsupported "\<\%(date\|time\)$\ze\s*=" " statements only |
| 326 | syn match qb64Unsupported "\<def\zs\s\+FN" |
| 327 | syn match qb64Unsupported "\<\%(exit\|end\)\s\+def\>" |
| 328 | syn match qb64Unsupported "\<width\s\+lprint\>" |
| 329 | |
| 330 | " Types {{{1 |
| 331 | syn keyword qb64Type _BIT _BYTE _FLOAT _INTEGER64 _MEM _OFFSET _UNSIGNED |
| 332 | |
| 333 | " Type suffixes {{{1 |
| 334 | if exists("basic_type_suffixes") |
| 335 | " TODO: handle leading word boundary and __+ prefix |
| 336 | syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=`\%(\d\+\)\=" |
| 337 | syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=\%(%\|%%\|&\|&&\|%&\)" |
| 338 | syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\%(!\|##\|#\)" |
| 339 | syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=$\%(\d\+\)\=" |
| 340 | endif |
| 341 | |
| 342 | " Numbers {{{1 |
| 343 | |
| 344 | " Integers |
| 345 | syn match qb64Number "-\=&b[01]\+&\>\=" |
| 346 | |
| 347 | syn match qb64Number "-\=\<[01]\~\=`\>" |
| 348 | syn match qb64Number "-\=\<\d\+`\d\+\>" |
| 349 | |
| 350 | syn match qb64Number "-\=\<\d\+\%(%%\|&&\|%&\)\>" |
| 351 | syn match qb64Number "\<\d\+\~\%(%%\|&&\|%&\)\>" |
| 352 | |
| 353 | syn match qb64Number "-\=\<&b[01]\+\%(%%\|&&\|%&\)\>" |
| 354 | syn match qb64Number "\<&b[01]\+\~\%(%%\|&&\|%&\)\>" |
| 355 | |
| 356 | syn match qb64Number "-\=\<&o\=\o\+\%(%%\|&&\|%&\)\>" |
| 357 | syn match qb64Number "\<&o\=\o\+\~\%(%%\|&&\|%&\)\>" |
| 358 | |
| 359 | syn match qb64Number "-\=\<&h\x\+\%(%%\|&&\|%&\)\>" |
| 360 | syn match qb64Number "\<&h\x\+\~\%(%%\|&&\|%&\)\>" |
| 361 | |
| 362 | " Floats |
| 363 | syn match qb64Float "-\=\<\d\+\.\=\d*##\>" |
| 364 | syn match qb64Float "-\=\<\.\d\+##\>" |
| 365 | |
| 366 | " Line numbers and labels {{{1 |
| 367 | syn match qb64LineLabel "\%(_\{2,}\)\=\a[[:alnum:]._]*[[:alnum:]]\ze\s*:" nextgroup=@basicStatements skipwhite contained |
| 368 | |
| 369 | " Metacommands {{{1 |
| 370 | syn match qb64Metacommand contained "$NOPREFIX\>" |
| 371 | syn match qb64Metacommand contained "$ASSERTS\%(:CONSOLE\)\=\>" |
| 372 | syn match qb64Metacommand contained "$CHECKING:\%(ON\|OFF\)\>" |
| 373 | syn match qb64Metacommand contained "$COLOR:\%(0\|32\)\>" |
| 374 | syn match qb64Metacommand contained "$CONSOLE\%(:ONLY\)\=\>" |
| 375 | syn match qb64Metacommand contained "$EXEICON\s*:\s*'[^']\+'" |
| 376 | syn match qb64Metacommand contained "$ERROR\>" |
| 377 | syn match qb64Metacommand contained "$LET\>" |
| 378 | syn match qb64Metacommand contained "$RESIZE:\%(ON\|OFF\|STRETCH\|SMOOTH\)\>" |
| 379 | syn match qb64Metacommand contained "$SCREEN\%(HIDE\|SHOW\)\>" |
| 380 | syn match qb64Metacommand contained "$VERSIONINFO\s*:.*" |
| 381 | syn match qb64Metacommand contained "$VIRTUALKEYBOARD:\%(ON\|OFF\)\>" |
| 382 | |
| 383 | syn region qb64IfMetacommand contained matchgroup=qb64Metacommand start="$\%(IF\|ELSEIF\)\>" end="\<THEN\>" oneline transparent contains=qb64Metavariable |
| 384 | syn match qb64Metacommand contained "$\%(ELSE\|END\s*IF\)\>" |
| 385 | |
| 386 | syn keyword qb64Metavariable contained defined undefined |
| 387 | syn keyword qb64Metavariable contained windows win linux mac maxosx |
| 388 | syn keyword qb64Metavariable contained 32bit 64bit version |
| 389 | |
| 390 | " Default Highlighting {{{1 |
| 391 | hi def link qb64Float basicFloat |
| 392 | hi def link qb64Function Function |
| 393 | hi def link qb64Keyword Keyword |
| 394 | hi def link qb64LineLabel basicLineLabel |
| 395 | hi def link qb64Metacommand PreProc |
| 396 | hi def link qb64Metavariable Identifier |
| 397 | hi def link qb64Number basicNumber |
| 398 | hi def link qb64Statement Statement |
| 399 | hi def link qb64TypeSuffix basicTypeSuffix |
| 400 | hi def link qb64Type Type |
| 401 | hi def link qb64Unsupported Error |
| 402 | |
| 403 | " Postscript {{{1 |
| 404 | let b:current_syntax = "qb64" |
| 405 | |
| 406 | let &cpo = s:cpo_save |
| 407 | unlet s:cpo_save |
| 408 | |
| 409 | " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: |