neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

mojo.vim (12647B)


      1 " Vim syntax file
      2 " Language:	Mojo
      3 " Maintainer:	Mahmoud Abduljawad <me@mahmoudajawad.com>
      4 " Last Change:	2023 Sep 09
      5 " Credits:	Mahmoud Abduljawad <me@mahmoudajawad.com>
      6 "         	Neil Schemenauer <nas@python.ca>
      7 "		Dmitry Vasiliev
      8 "
      9 "		This is based on Vim Python highlighting
     10 "
     11 "		- introduced highlighting of doctests
     12 "		- updated keywords, built-ins, and exceptions
     13 "		- corrected regular expressions for
     14 "
     15 "		  * functions
     16 "		  * decorators
     17 "		  * strings
     18 "		  * escapes
     19 "		  * numbers
     20 "		  * space error
     21 "
     22 "		- corrected synchronization
     23 "		- more highlighting is ON by default, except
     24 "		- space error highlighting is OFF by default
     25 "
     26 " Optional highlighting can be controlled using these variables.
     27 "
     28 "   let mojo_no_builtin_highlight = 1
     29 "   let mojo_no_doctest_code_highlight = 1
     30 "   let mojo_no_doctest_highlight = 1
     31 "   let mojo_no_exception_highlight = 1
     32 "   let mojo_no_number_highlight = 1
     33 "   let mojo_space_error_highlight = 1
     34 "
     35 " All the options above can be switched on together.
     36 "
     37 "   let mojo_highlight_all = 1
     38 "
     39 " The use of Python 2 compatible syntax highlighting can be enforced.
     40 " The straddling code (Python 2 and 3 compatible), up to Python 3.5,
     41 " will be also supported.
     42 "
     43 "   let mojo_use_python2_syntax = 1
     44 "
     45 " This option will exclude all modern Python 3.6 or higher features.
     46 "
     47 
     48 " quit when a syntax file was already loaded.
     49 if exists("b:current_syntax")
     50  finish
     51 endif
     52 
     53 " We need nocompatible mode in order to continue lines with backslashes.
     54 " Original setting will be restored.
     55 let s:cpo_save = &cpo
     56 set cpo&vim
     57 
     58 if exists("mojo_no_doctest_highlight")
     59  let mojo_no_doctest_code_highlight = 1
     60 endif
     61 
     62 if exists("mojo_highlight_all")
     63  if exists("mojo_no_builtin_highlight")
     64    unlet mojo_no_builtin_highlight
     65  endif
     66  if exists("mojo_no_doctest_code_highlight")
     67    unlet mojo_no_doctest_code_highlight
     68  endif
     69  if exists("mojo_no_doctest_highlight")
     70    unlet mojo_no_doctest_highlight
     71  endif
     72  if exists("mojo_no_exception_highlight")
     73    unlet mojo_no_exception_highlight
     74  endif
     75  if exists("mojo_no_number_highlight")
     76    unlet mojo_no_number_highlight
     77  endif
     78  let mojo_space_error_highlight = 1
     79 endif
     80 
     81 " These keywords are based on Python syntax highlight, and adds to it struct,
     82 " fn, alias, var, let
     83 "
     84 syn keyword mojoStatement	False None True
     85 syn keyword mojoStatement	as assert break continue del global
     86 syn keyword mojoStatement	lambda nonlocal pass return with yield
     87 syn keyword mojoStatement	class def nextgroup=mojoFunction skipwhite
     88 syn keyword mojoStatement	struct fn nextgroup=mojoFunction skipwhite
     89 syn keyword mojoStatement	alias var let
     90 syn keyword mojoConditional	elif else if
     91 syn keyword mojoRepeat		for while
     92 syn keyword mojoOperator	and in is not or
     93 syn keyword mojoException	except finally raise try
     94 syn keyword mojoInclude		from import
     95 syn keyword mojoAsync		async await
     96 
     97 " Soft keywords
     98 " These keywords do not mean anything unless used in the right context.
     99 " See https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords
    100 " for more on this.
    101 syn match   mojoConditional   "^\s*\zscase\%(\s\+.*:.*$\)\@="
    102 syn match   mojoConditional   "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@="
    103 
    104 " Decorators
    105 " A dot must be allowed because of @MyClass.myfunc decorators.
    106 syn match   mojoDecorator	"@" display contained
    107 syn match   mojoDecoratorName	"@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
    108 
    109 " Python 3.5 introduced the use of the same symbol for matrix multiplication:
    110 " https://www.python.org/dev/peps/pep-0465/.  We now have to exclude the
    111 " symbol from highlighting when used in that context.
    112 " Single line multiplication.
    113 syn match   mojoMatrixMultiply
    114      \ "\%(\w\|[])]\)\s*@"
    115      \ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
    116      \ transparent
    117 " Multiplication continued on the next line after backslash.
    118 syn match   mojoMatrixMultiply
    119      \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
    120      \ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
    121      \ transparent
    122 " Multiplication in a parenthesized expression over multiple lines with @ at
    123 " the start of each continued line; very similar to decorators and complex.
    124 syn match   mojoMatrixMultiply
    125      \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
    126      \ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
    127      \ transparent
    128 
    129 syn match   mojoFunction	"\h\w*" display contained
    130 
    131 syn match   mojoComment	"#.*$" contains=mojoTodo,@Spell
    132 syn keyword mojoTodo		FIXME NOTE NOTES TODO XXX contained
    133 
    134 " Triple-quoted strings can contain doctests.
    135 syn region  mojoString matchgroup=mojoQuotes
    136      \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
    137      \ contains=mojoEscape,@Spell
    138 syn region  mojoString matchgroup=mojoTripleQuotes
    139      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
    140      \ contains=mojoEscape,mojoSpaceError,mojoDoctest,@Spell
    141 syn region  mojoRawString matchgroup=mojoQuotes
    142      \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
    143      \ contains=@Spell
    144 syn region  mojoRawString matchgroup=pythonTripleQuotes
    145      \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
    146      \ contains=pythonSpaceError,mojoDoctest,@Spell
    147 
    148 syn match   mojoEscape	+\\[abfnrtv'"\\]+ contained
    149 syn match   mojoEscape	"\\\o\{1,3}" contained
    150 syn match   mojoEscape	"\\x\x\{2}" contained
    151 syn match   mojoEscape	"\%(\\u\x\{4}\|\\U\x\{8}\)" contained
    152 " Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
    153 syn match   mojoEscape	"\\N{\a\+\%(\s\a\+\)*}" contained
    154 syn match   mojoEscape	"\\$"
    155 
    156 " It is very important to understand all details before changing the
    157 " regular expressions below or their order.
    158 " The word boundaries are *not* the floating-point number boundaries
    159 " because of a possible leading or trailing decimal point.
    160 " The expressions below ensure that all valid number literals are
    161 " highlighted, and invalid number literals are not.  For example,
    162 "
    163 " - a decimal point in '4.' at the end of a line is highlighted,
    164 " - a second dot in 1.0.0 is not highlighted,
    165 " - 08 is not highlighted,
    166 " - 08e0 or 08j are highlighted,
    167 "
    168 " and so on, as specified in the 'Python Language Reference'.
    169 " https://docs.python.org/reference/lexical_analysis.html#numeric-literals
    170 if !exists("mojo_no_number_highlight")
    171  " numbers (including complex)
    172  syn match   mojoNumber	"\<0[oO]\%(_\=\o\)\+\>"
    173  syn match   mojoNumber	"\<0[xX]\%(_\=\x\)\+\>"
    174  syn match   mojoNumber	"\<0[bB]\%(_\=[01]\)\+\>"
    175  syn match   mojoNumber	"\<\%([1-9]\%(_\=\d\)*\|0\+\%(_\=0\)*\)\>"
    176  syn match   mojoNumber	"\<\d\%(_\=\d\)*[jJ]\>"
    177  syn match   mojoNumber	"\<\d\%(_\=\d\)*[eE][+-]\=\d\%(_\=\d\)*[jJ]\=\>"
    178  syn match   mojoNumber
    179        \ "\<\d\%(_\=\d\)*\.\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\%(\W\|$\)\@="
    180  syn match   mojoNumber
    181        \ "\%(^\|\W\)\zs\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\>"
    182 endif
    183 
    184 " The built-ins are added in the same order of appearance in Mojo stdlib docs
    185 " https://docs.modular.com/mojo/lib.html
    186 "
    187 if !exists("mojo_no_builtin_highlight")
    188  " Built-in functions
    189  syn keyword mojoBuiltin	slice constrained debug_assert put_new_line print
    190  syn keyword mojoBuiltin	print_no_newline len range rebind element_type 
    191  syn keyword mojoBuiltin	ord chr atol isdigit index address string
    192  " Built-in types
    193  syn keyword mojoType		Byte ListLiteral CoroutineContext Coroutine DType
    194  syn keyword mojoType		dtype type invalid bool int8 si8 unit8 ui8 int16 
    195  syn keyword mojoType		si16 unit16 ui16 int32 si32 uint32 ui32 int64 
    196  syn keyword mojoType		si64 uint64 ui64 bfloat16 bf16 float16 f16 float32
    197  syn keyword mojoType		f32 float64 f64 Error FloatLiteral Int Attr SIMD 
    198  syn keyword mojoType		Int8 UInt8 Int16 UInt16 Int32 UInt32 Int64 UInt64
    199  syn keyword mojoType		Float16 Float32 Float64 element_type _65x13_type
    200  syn keyword mojoType		String StringLiteral StringRef Tuple AnyType
    201  syn keyword mojoType		NoneType None Lifetime
    202  " avoid highlighting attributes as builtins
    203  syn match   mojoAttribute	/\.\h\w*/hs=s+1
    204 \ contains=ALLBUT,mojoBuiltin,mojoFunction,mojoAsync
    205 \ transparent
    206 endif
    207 
    208 " From the 'Python Library Reference' class hierarchy at the bottom.
    209 " http://docs.python.org/library/exceptions.html
    210 if !exists("mojo_no_exception_highlight")
    211  " builtin base exceptions (used mostly as base classes for other exceptions)
    212  syn keyword mojoExceptions	BaseException Exception
    213  syn keyword mojoExceptions	ArithmeticError BufferError LookupError
    214  " builtin exceptions (actually raised)
    215  syn keyword mojoExceptions	AssertionError AttributeError EOFError
    216  syn keyword mojoExceptions	FloatingPointError GeneratorExit ImportError
    217  syn keyword mojoExceptions	IndentationError IndexError KeyError
    218  syn keyword mojoExceptions	KeyboardInterrupt MemoryError
    219  syn keyword mojoExceptions	ModuleNotFoundError NameError
    220  syn keyword mojoExceptions	NotImplementedError OSError OverflowError
    221  syn keyword mojoExceptions	RecursionError ReferenceError RuntimeError
    222  syn keyword mojoExceptions	StopAsyncIteration StopIteration SyntaxError
    223  syn keyword mojoExceptions	SystemError SystemExit TabError TypeError
    224  syn keyword mojoExceptions	UnboundLocalError UnicodeDecodeError
    225  syn keyword mojoExceptions	UnicodeEncodeError UnicodeError
    226  syn keyword mojoExceptions	UnicodeTranslateError ValueError
    227  syn keyword mojoExceptions	ZeroDivisionError
    228  " builtin exception aliases for OSError
    229  syn keyword mojoExceptions	EnvironmentError IOError WindowsError
    230  " builtin OS exceptions in Python 3
    231  syn keyword mojoExceptions	BlockingIOError BrokenPipeError
    232  syn keyword mojoExceptions	ChildProcessError ConnectionAbortedError
    233  syn keyword mojoExceptions	ConnectionError ConnectionRefusedError
    234  syn keyword mojoExceptions	ConnectionResetError FileExistsError
    235  syn keyword mojoExceptions	FileNotFoundError InterruptedError
    236  syn keyword mojoExceptions	IsADirectoryError NotADirectoryError
    237  syn keyword mojoExceptions	PermissionError ProcessLookupError TimeoutError
    238  " builtin warnings
    239  syn keyword mojoExceptions	BytesWarning DeprecationWarning FutureWarning
    240  syn keyword mojoExceptions	ImportWarning PendingDeprecationWarning
    241  syn keyword mojoExceptions	ResourceWarning RuntimeWarning
    242  syn keyword mojoExceptions	SyntaxWarning UnicodeWarning
    243  syn keyword mojoExceptions	UserWarning Warning
    244 endif
    245 
    246 if exists("mojo_space_error_highlight")
    247  " trailing whitespace
    248  syn match   mojoSpaceError	display excludenl "\s\+$"
    249  " mixed tabs and spaces
    250  syn match   mojoSpaceError	display " \+\t"
    251  syn match   mojoSpaceError	display "\t\+ "
    252 endif
    253 
    254 " Do not spell doctests inside strings.
    255 " Notice that the end of a string, either ''', or """, will end the contained
    256 " doctest too.  Thus, we do *not* need to have it as an end pattern.
    257 if !exists("mojo_no_doctest_highlight")
    258  if !exists("mojo_no_doctest_code_highlight")
    259    syn region mojoDoctest
    260   \ start="^\s*>>>\s" end="^\s*$"
    261   \ contained contains=ALLBUT,mojoDoctest,mojoFunction,@Spell
    262    syn region mojoDoctestValue
    263   \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
    264   \ contained
    265  else
    266    syn region mojoDoctest
    267   \ start="^\s*>>>" end="^\s*$"
    268   \ contained contains=@NoSpell
    269  endif
    270 endif
    271 
    272 " Sync at the beginning of class, function, or method definition.
    273 syn sync match mojoSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
    274 
    275 " The default highlight links.  Can be overridden later.
    276 hi def link mojoStatement		Statement
    277 hi def link mojoConditional		Conditional
    278 hi def link mojoRepeat			Repeat
    279 hi def link mojoOperator		Operator
    280 hi def link mojoException		Exception
    281 hi def link mojoInclude			Include
    282 hi def link mojoAsync			Statement
    283 hi def link mojoDecorator		Define
    284 hi def link mojoDecoratorName		Function
    285 hi def link mojoFunction		Function
    286 hi def link mojoComment			Comment
    287 hi def link mojoTodo			Todo
    288 hi def link mojoString			String
    289 hi def link mojoRawString		String
    290 hi def link mojoQuotes			String
    291 hi def link mojoTripleQuotes		mojoQuotes
    292 hi def link mojoEscape			Special
    293 if !exists("mojo_no_number_highlight")
    294  hi def link mojoNumber		Number
    295 endif
    296 if !exists("mojo_no_builtin_highlight")
    297  hi def link mojoBuiltin		Function
    298  hi def link mojoType			Type
    299 endif
    300 if !exists("mojo_no_exception_highlight")
    301  hi def link mojoExceptions		Structure
    302 endif
    303 if exists("mojo_space_error_highlight")
    304  hi def link mojoSpaceError		Error
    305 endif
    306 if !exists("mojo_no_doctest_highlight")
    307  hi def link mojoDoctest		Special
    308  hi def link mojoDoctestValue	Define
    309 endif
    310 
    311 let b:current_syntax = "mojo"
    312 
    313 let &cpo = s:cpo_save
    314 unlet s:cpo_save
    315 
    316 " vim:set sw=2 sts=2 ts=8 noet: