" Vim syntax file " Language: BASIC (QuickBASIC 4.5) " Maintainer: Doug Kearns " Previous Maintainer: Allan Kelly " Contributors: Thilo Six " 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. " " Second version attempts to match Microsoft QuickBASIC 4.5 while keeping FreeBASIC " (-lang qb) and QB64 (excluding extensions) in mind. -- DJK " Prelude {{{1 if exists("b:current_syntax") finish endif let s:cpo_save = &cpo set cpo&vim syn iskeyword @,48-57,.,!,#,%,&,$ syn case ignore " Whitespace Errors {{{1 if exists("basic_space_errors") if !exists("basic_no_trail_space_error") syn match basicSpaceError display excludenl "\s\+$" endif if !exists("basic_no_tab_space_error") syn match basicSpaceError display " \+\t"me=e-1 endif endif " Comment Errors {{{1 if !exists("basic_no_comment_errors") syn match basicCommentError "\.*" endif " Not Top Cluster {{{1 syn cluster basicNotTop contains=@basicLineIdentifier,basicDataString,basicDataSeparator,basicTodo " Statements {{{1 syn cluster basicStatements contains=basicStatement,basicDataStatement,basicMetaRemStatement,basicPutStatement,basicRemStatement let s:statements =<< trim EOL " {{{2 beep bload bsave call calls case chain chdir circle clear close cls color com common const declare def def\s\+seg defdbl defint deflng defsng defstr dim do draw elseif end end\s\+\%(def\|function\|if\|select\|sub\|type\) environ erase error exit\s\+\%(def\|do\|for\|function\|sub\) field files for function get gosub goto if input ioctl key kill let line line\s\+input locate lock loop lprint lset mkdir name next on on\s\+error on\s\+uevent open open\s\+com option out paint palette palette\s\+using pcopy pen pmap poke preset print pset randomize read redim reset restore resume return rmdir rset run select\s\+case shared shell sleep sound static stop strig sub swap system troff tron type uevent unlock using view view\s\+print wait wend while width window write EOL " }}} for s in s:statements exe 'syn match basicStatement "\<' .. s .. '\>" contained' endfor syn match basicStatement "\<\%(then\|else\)\>" nextgroup=@basicStatements skipwhite " DATA Statement syn match basicDataSeparator "," contained syn region basicDataStatement matchgroup=basicStatement start="\" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicDataSeparator,basicDataString,basicNumber,basicFloat,basicString if !exists("basic_no_data_fold") syn region basicMultilineData start="^\s*\.*\n\%(^\s*\\)\@=" end="^\s*\.*\n\%(^\s*\\)\@!" contains=basicDataStatement transparent fold keepend endif " PUT File I/O and Graphics statements - needs special handling for graphics " action verbs syn match basicPutAction "\<\%(pset\|preset\|and\|or\|xor\)\>" contained syn region basicPutStatement matchgroup=basicStatement start="\" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicKeyword,basicPutAction,basicFilenumber " Keywords {{{1 let s:keywords =<< trim EOL " {{{2 absolute access alias append as base binary byval cdecl com def do for function gosub goto input int86old int86xold interrupt interruptx is key len list local lock lprint next off on output pen play random read resume screen seg shared signal static step stop strig sub timer to until using while write EOL " }}} for k in s:keywords exe 'syn match basicKeyword "\<' .. k .. '\>"' endfor " Functions {{{1 syn keyword basicFunction abs asc atn cdbl chr$ cint clng command$ cos csng syn keyword basicFunction csrlin cvd cvdmbf cvi cvl cvs cvsmbf environ$ eof syn keyword basicFunction erdev erdev$ erl err exp fileattr fix fre freefile syn keyword basicFunction hex$ inkey$ inp input$ instr int ioctl$ left$ lbound syn keyword basicFunction lcase$ len loc lof log lpos ltrim$ mkd$ mkdmbf$ mki$ syn keyword basicFunction mkl$ mks$ mksmbf$ oct$ peek pen point pos right$ rnd syn keyword basicFunction rtrim$ sadd setmem sgn sin space$ spc sqr stick str$ syn keyword basicFunction strig string$ tab tan ubound ucase$ val valptr syn keyword basicFunction valseg varptr varptr$ varseg " Functions and statements (same name) {{{1 syn match basicStatement "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" contained syn match basicFunction "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" " Types {{{1 syn keyword basicType integer long single double string any " Strings {{{1 " Unquoted DATA strings - anything except [:,] and leading or trailing whitespace " Needs lower priority than numbers syn match basicDataString "[^[:space:],:]\+\%(\s\+[^[:space:],:]\+\)*" contained syn region basicString start=+"+ end=+"+ oneline " Booleans {{{1 if exists("basic_booleans") syn keyword basicBoolean true false endif " Numbers {{{1 " Integers syn match basicNumber "-\=&o\=\o\+[%&]\=\>" syn match basicNumber "-\=&h\x\+[%&]\=\>" syn match basicNumber "-\=\<\d\+[%&]\=\>" " Floats syn match basicFloat "-\=\<\d\+\.\=\d*\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>" syn match basicFloat "-\=\<\.\d\+\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>" " Statement anchors {{{1 syn match basicLineStart "^" nextgroup=@basicStatements,@basicLineIdentifier skipwhite syn match basicStatementSeparator ":" nextgroup=@basicStatements skipwhite " Line numbers and labels {{{1 " QuickBASIC limits these to 65,529 and 40 chars respectively syn match basicLineNumber "\d\+" nextgroup=@basicStatements skipwhite contained syn match basicLineLabel "\a[[:alnum:]]*\ze\s*:" nextgroup=@basicStatements skipwhite contained syn cluster basicLineIdentifier contains=basicLineNumber,basicLineLabel " Line Continuation {{{1 syn match basicLineContinuation "\s*\zs_\ze\s*$" " Type suffixes {{{1 if exists("basic_type_suffixes") syn match basicTypeSuffix "\a[[:alnum:].]*\zs[$%&!#]" endif " File numbers {{{1 syn match basicFilenumber "#\d\+" syn match basicFilenumber "#\a[[:alnum:].]*[%&!#]\=" " Operators {{{1 if exists("basic_operators") syn match basicArithmeticOperator "[-+*/\\^]" syn match basicRelationalOperator "<>\|<=\|>=\|[><=]" endif syn match basicLogicalOperator "\<\%(not\|and\|or\|xor\|eqv\|imp\)\>" syn match basicArithmeticOperator "\" " Metacommands {{{1 " Note: No trailing word boundaries. Text may be freely mixed however there " must be only leading whitespace prior to the first metacommand syn match basicMetacommand "$INCLUDE\s*:\s*'[^']\+'" contained containedin=@basicMetaComments syn match basicMetacommand "$\%(DYNAMIC\|STATIC\)" contained containedin=@basicMetaComments " Comments {{{1 syn keyword basicTodo TODO FIXME XXX NOTE contained syn region basicRemStatement matchgroup=basicStatement start="REM\>" end="$" contains=basicTodo,@Spell contained syn region basicComment start="'" end="$" contains=basicTodo,@Spell if !exists("basic_no_comment_fold") syn region basicMultilineComment start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=@basicComments transparent fold keepend endif " Metacommands syn region basicMetaRemStatement matchgroup=basicStatement start="REM\>\s*\$\@=" end="$" contains=basicTodo contained syn region basicMetaComment start="'\s*\$\@=" end="$" contains=basicTodo syn cluster basicMetaComments contains=basicMetaComment,basicMetaRemStatement syn cluster basicComments contains=basicComment,basicMetaComment "syn sync ccomment basicComment " Default Highlighting {{{1 hi def link basicArithmeticOperator basicOperator hi def link basicBoolean Boolean hi def link basicComment Comment hi def link basicCommentError Error hi def link basicDataString basicString hi def link basicFilenumber basicTypeSuffix " TODO: better group hi def link basicFloat Float hi def link basicFunction Function hi def link basicKeyword Keyword hi def link basicLineIdentifier LineNr hi def link basicLineContinuation Special hi def link basicLineLabel basicLineIdentifier hi def link basicLineNumber basicLineIdentifier hi def link basicLogicalOperator basicOperator hi def link basicMetacommand SpecialComment hi def link basicMetaComment Comment hi def link basicMetaRemStatement Comment hi def link basicNumber Number hi def link basicOperator Operator hi def link basicPutAction Keyword hi def link basicRelationalOperator basicOperator hi def link basicRemStatement Comment hi def link basicSpaceError Error hi def link basicStatementSeparator Special hi def link basicStatement Statement hi def link basicString String hi def link basicTodo Todo hi def link basicType Type hi def link basicTypeSuffix Special if exists("basic_legacy_syntax_groups") hi def link basicTypeSpecifier Type hi def link basicTypeSuffix basicTypeSpecifier endif " Postscript {{{1 let b:current_syntax = "basic" let &cpo = s:cpo_save unlet s:cpo_save " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: