mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			381 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim syntax file
 | 
						|
" Language:		BASIC (QuickBASIC 4.5)
 | 
						|
" Maintainer:		Doug Kearns <dougkearns@gmail.com>
 | 
						|
" Previous Maintainer:	Allan Kelly <allan@fruitloaf.co.uk>
 | 
						|
" 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 "\<REM\>.*"
 | 
						|
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="\<data\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicDataSeparator,basicDataString,basicNumber,basicFloat,basicString
 | 
						|
 | 
						|
if !exists("basic_no_data_fold")
 | 
						|
  syn region basicMultilineData start="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@=" end="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@!" 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="\<put\>" 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 "\<mod\>"
 | 
						|
 | 
						|
" 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:
 |