neovim/runtime/syntax/mojo.vim
Christian Clason 60e5d0fbcc vim-patch:9.0.1891: No runtime support for Mojo
Problem:  No runtime support for Mojo
Solution: Add basic filetype and syntax plugins

closes: vim/vim#13062
closes: vim/vim#13063

0ce2c594d0

Co-authored-by: Mahmoud Abduljawad <mahmoud@masaar.com>
2023-09-11 10:05:54 +02:00

317 lines
12 KiB
VimL

" Vim syntax file
" Language: Mojo
" Maintainer: Mahmoud Abduljawad <me@mahmoudajawad.com>
" Last Change: 2023 Sep 09
" Credits: Mahmoud Abduljawad <me@mahmoudajawad.com>
" Neil Schemenauer <nas@python.ca>
" Dmitry Vasiliev
"
" This is based on Vim Python highlighting
"
" - introduced highlighting of doctests
" - updated keywords, built-ins, and exceptions
" - corrected regular expressions for
"
" * functions
" * decorators
" * strings
" * escapes
" * numbers
" * space error
"
" - corrected synchronization
" - more highlighting is ON by default, except
" - space error highlighting is OFF by default
"
" Optional highlighting can be controlled using these variables.
"
" let mojo_no_builtin_highlight = 1
" let mojo_no_doctest_code_highlight = 1
" let mojo_no_doctest_highlight = 1
" let mojo_no_exception_highlight = 1
" let mojo_no_number_highlight = 1
" let mojo_space_error_highlight = 1
"
" All the options above can be switched on together.
"
" let mojo_highlight_all = 1
"
" The use of Python 2 compatible syntax highlighting can be enforced.
" The straddling code (Python 2 and 3 compatible), up to Python 3.5,
" will be also supported.
"
" let mojo_use_python2_syntax = 1
"
" This option will exclude all modern Python 3.6 or higher features.
"
" quit when a syntax file was already loaded.
if exists("b:current_syntax")
finish
endif
" We need nocompatible mode in order to continue lines with backslashes.
" Original setting will be restored.
let s:cpo_save = &cpo
set cpo&vim
if exists("mojo_no_doctest_highlight")
let mojo_no_doctest_code_highlight = 1
endif
if exists("mojo_highlight_all")
if exists("mojo_no_builtin_highlight")
unlet mojo_no_builtin_highlight
endif
if exists("mojo_no_doctest_code_highlight")
unlet mojo_no_doctest_code_highlight
endif
if exists("mojo_no_doctest_highlight")
unlet mojo_no_doctest_highlight
endif
if exists("mojo_no_exception_highlight")
unlet mojo_no_exception_highlight
endif
if exists("mojo_no_number_highlight")
unlet mojo_no_number_highlight
endif
let mojo_space_error_highlight = 1
endif
" These keywords are based on Python syntax highlight, and adds to it struct,
" fn, alias, var, let
"
syn keyword mojoStatement False None True
syn keyword mojoStatement as assert break continue del global
syn keyword mojoStatement lambda nonlocal pass return with yield
syn keyword mojoStatement class def nextgroup=mojoFunction skipwhite
syn keyword mojoStatement struct fn nextgroup=mojoFunction skipwhite
syn keyword mojoStatement alias var let
syn keyword mojoConditional elif else if
syn keyword mojoRepeat for while
syn keyword mojoOperator and in is not or
syn keyword mojoException except finally raise try
syn keyword mojoInclude from import
syn keyword mojoAsync async await
" Soft keywords
" These keywords do not mean anything unless used in the right context.
" See https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords
" for more on this.
syn match mojoConditional "^\s*\zscase\%(\s\+.*:.*$\)\@="
syn match mojoConditional "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@="
" Decorators
" A dot must be allowed because of @MyClass.myfunc decorators.
syn match mojoDecorator "@" display contained
syn match mojoDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
" Python 3.5 introduced the use of the same symbol for matrix multiplication:
" https://www.python.org/dev/peps/pep-0465/. We now have to exclude the
" symbol from highlighting when used in that context.
" Single line multiplication.
syn match mojoMatrixMultiply
\ "\%(\w\|[])]\)\s*@"
\ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
\ transparent
" Multiplication continued on the next line after backslash.
syn match mojoMatrixMultiply
\ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
\ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
\ transparent
" Multiplication in a parenthesized expression over multiple lines with @ at
" the start of each continued line; very similar to decorators and complex.
syn match mojoMatrixMultiply
\ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
\ contains=ALLBUT,mojoDecoratorName,mojoDecorator,mojoFunction,mojoDoctestValue
\ transparent
syn match mojoFunction "\h\w*" display contained
syn match mojoComment "#.*$" contains=mojoTodo,@Spell
syn keyword mojoTodo FIXME NOTE NOTES TODO XXX contained
" Triple-quoted strings can contain doctests.
syn region mojoString matchgroup=mojoQuotes
\ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
\ contains=mojoEscape,@Spell
syn region mojoString matchgroup=mojoTripleQuotes
\ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
\ contains=mojoEscape,mojoSpaceError,mojoDoctest,@Spell
syn region mojoRawString matchgroup=mojoQuotes
\ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
\ contains=@Spell
syn region mojoRawString matchgroup=pythonTripleQuotes
\ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
\ contains=pythonSpaceError,mojoDoctest,@Spell
syn match mojoEscape +\\[abfnrtv'"\\]+ contained
syn match mojoEscape "\\\o\{1,3}" contained
syn match mojoEscape "\\x\x\{2}" contained
syn match mojoEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
syn match mojoEscape "\\N{\a\+\%(\s\a\+\)*}" contained
syn match mojoEscape "\\$"
" It is very important to understand all details before changing the
" regular expressions below or their order.
" The word boundaries are *not* the floating-point number boundaries
" because of a possible leading or trailing decimal point.
" The expressions below ensure that all valid number literals are
" highlighted, and invalid number literals are not. For example,
"
" - a decimal point in '4.' at the end of a line is highlighted,
" - a second dot in 1.0.0 is not highlighted,
" - 08 is not highlighted,
" - 08e0 or 08j are highlighted,
"
" and so on, as specified in the 'Python Language Reference'.
" https://docs.python.org/reference/lexical_analysis.html#numeric-literals
if !exists("mojo_no_number_highlight")
" numbers (including complex)
syn match mojoNumber "\<0[oO]\%(_\=\o\)\+\>"
syn match mojoNumber "\<0[xX]\%(_\=\x\)\+\>"
syn match mojoNumber "\<0[bB]\%(_\=[01]\)\+\>"
syn match mojoNumber "\<\%([1-9]\%(_\=\d\)*\|0\+\%(_\=0\)*\)\>"
syn match mojoNumber "\<\d\%(_\=\d\)*[jJ]\>"
syn match mojoNumber "\<\d\%(_\=\d\)*[eE][+-]\=\d\%(_\=\d\)*[jJ]\=\>"
syn match mojoNumber
\ "\<\d\%(_\=\d\)*\.\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\%(\W\|$\)\@="
syn match mojoNumber
\ "\%(^\|\W\)\zs\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\>"
endif
" The built-ins are added in the same order of appearance in Mojo stdlib docs
" https://docs.modular.com/mojo/lib.html
"
if !exists("mojo_no_builtin_highlight")
" Built-in functions
syn keyword mojoBuiltin slice constrained debug_assert put_new_line print
syn keyword mojoBuiltin print_no_newline len range rebind element_type
syn keyword mojoBuiltin ord chr atol isdigit index address string
" Built-in types
syn keyword mojoType Byte ListLiteral CoroutineContext Coroutine DType
syn keyword mojoType dtype type invalid bool int8 si8 unit8 ui8 int16
syn keyword mojoType si16 unit16 ui16 int32 si32 uint32 ui32 int64
syn keyword mojoType si64 uint64 ui64 bfloat16 bf16 float16 f16 float32
syn keyword mojoType f32 float64 f64 Error FloatLiteral Int Attr SIMD
syn keyword mojoType Int8 UInt8 Int16 UInt16 Int32 UInt32 Int64 UInt64
syn keyword mojoType Float16 Float32 Float64 element_type _65x13_type
syn keyword mojoType String StringLiteral StringRef Tuple AnyType
syn keyword mojoType NoneType None Lifetime
" avoid highlighting attributes as builtins
syn match mojoAttribute /\.\h\w*/hs=s+1
\ contains=ALLBUT,mojoBuiltin,mojoFunction,mojoAsync
\ transparent
endif
" From the 'Python Library Reference' class hierarchy at the bottom.
" http://docs.python.org/library/exceptions.html
if !exists("mojo_no_exception_highlight")
" builtin base exceptions (used mostly as base classes for other exceptions)
syn keyword mojoExceptions BaseException Exception
syn keyword mojoExceptions ArithmeticError BufferError LookupError
" builtin exceptions (actually raised)
syn keyword mojoExceptions AssertionError AttributeError EOFError
syn keyword mojoExceptions FloatingPointError GeneratorExit ImportError
syn keyword mojoExceptions IndentationError IndexError KeyError
syn keyword mojoExceptions KeyboardInterrupt MemoryError
syn keyword mojoExceptions ModuleNotFoundError NameError
syn keyword mojoExceptions NotImplementedError OSError OverflowError
syn keyword mojoExceptions RecursionError ReferenceError RuntimeError
syn keyword mojoExceptions StopAsyncIteration StopIteration SyntaxError
syn keyword mojoExceptions SystemError SystemExit TabError TypeError
syn keyword mojoExceptions UnboundLocalError UnicodeDecodeError
syn keyword mojoExceptions UnicodeEncodeError UnicodeError
syn keyword mojoExceptions UnicodeTranslateError ValueError
syn keyword mojoExceptions ZeroDivisionError
" builtin exception aliases for OSError
syn keyword mojoExceptions EnvironmentError IOError WindowsError
" builtin OS exceptions in Python 3
syn keyword mojoExceptions BlockingIOError BrokenPipeError
syn keyword mojoExceptions ChildProcessError ConnectionAbortedError
syn keyword mojoExceptions ConnectionError ConnectionRefusedError
syn keyword mojoExceptions ConnectionResetError FileExistsError
syn keyword mojoExceptions FileNotFoundError InterruptedError
syn keyword mojoExceptions IsADirectoryError NotADirectoryError
syn keyword mojoExceptions PermissionError ProcessLookupError TimeoutError
" builtin warnings
syn keyword mojoExceptions BytesWarning DeprecationWarning FutureWarning
syn keyword mojoExceptions ImportWarning PendingDeprecationWarning
syn keyword mojoExceptions ResourceWarning RuntimeWarning
syn keyword mojoExceptions SyntaxWarning UnicodeWarning
syn keyword mojoExceptions UserWarning Warning
endif
if exists("mojo_space_error_highlight")
" trailing whitespace
syn match mojoSpaceError display excludenl "\s\+$"
" mixed tabs and spaces
syn match mojoSpaceError display " \+\t"
syn match mojoSpaceError display "\t\+ "
endif
" Do not spell doctests inside strings.
" Notice that the end of a string, either ''', or """, will end the contained
" doctest too. Thus, we do *not* need to have it as an end pattern.
if !exists("mojo_no_doctest_highlight")
if !exists("mojo_no_doctest_code_highlight")
syn region mojoDoctest
\ start="^\s*>>>\s" end="^\s*$"
\ contained contains=ALLBUT,mojoDoctest,mojoFunction,@Spell
syn region mojoDoctestValue
\ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
\ contained
else
syn region mojoDoctest
\ start="^\s*>>>" end="^\s*$"
\ contained contains=@NoSpell
endif
endif
" Sync at the beginning of class, function, or method definition.
syn sync match mojoSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
" The default highlight links. Can be overridden later.
hi def link mojoStatement Statement
hi def link mojoConditional Conditional
hi def link mojoRepeat Repeat
hi def link mojoOperator Operator
hi def link mojoException Exception
hi def link mojoInclude Include
hi def link mojoAsync Statement
hi def link mojoDecorator Define
hi def link mojoDecoratorName Function
hi def link mojoFunction Function
hi def link mojoComment Comment
hi def link mojoTodo Todo
hi def link mojoString String
hi def link mojoRawString String
hi def link mojoQuotes String
hi def link mojoTripleQuotes mojoQuotes
hi def link mojoEscape Special
if !exists("mojo_no_number_highlight")
hi def link mojoNumber Number
endif
if !exists("mojo_no_builtin_highlight")
hi def link mojoBuiltin Function
hi def link mojoType Type
endif
if !exists("mojo_no_exception_highlight")
hi def link mojoExceptions Structure
endif
if exists("mojo_space_error_highlight")
hi def link mojoSpaceError Error
endif
if !exists("mojo_no_doctest_highlight")
hi def link mojoDoctest Special
hi def link mojoDoctestValue Define
endif
let b:current_syntax = "mojo"
let &cpo = s:cpo_save
unlet s:cpo_save
" vim:set sw=2 sts=2 ts=8 noet: