mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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:
 | 
