summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahmoud Abduljawad <mahmoud@masaar.com>2023-09-10 18:23:04 +0200
committerChristian Brabandt <cb@256bit.org>2023-09-10 18:23:04 +0200
commit0ce2c594d0704f27a16d2c13fce85d596cc91489 (patch)
tree61f5825bd4299857cb1ee4c869b06841a9785919
parentf36bbcd402c6ee5a27bcab3b20b6362ab93b8898 (diff)
patch 9.0.1891: No runtime support for Mojov9.0.1891
Problem: No runtime support for Mojo Solution: Add basic filetype and syntax plugins closes: #13062 closes: #13063 Signed-off-by: Christian Brabandt <cb@256bit.org> Signed-off-by: Doug Kearns <dougkearns@gmail.com> Co-authored-by: Mahmoud Abduljawad <mahmoud@masaar.com>
-rw-r--r--runtime/filetype.vim4
-rw-r--r--runtime/syntax/mojo.vim316
-rw-r--r--src/testdir/test_filetype.vim1
-rw-r--r--src/version.c2
4 files changed, 323 insertions, 0 deletions
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 81764c1b59..9b7e698c21 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1368,6 +1368,10 @@ au BufNewFile,BufRead *.rc,*.rch
\ setf rc |
\ endif
+" Mojo
+" Mojo files use either .mojo or .🔥 as extension
+au BufNewFile,BufRead *.mojo,*.🔥 setf mojo
+
" MuPAD source
au BufRead,BufNewFile *.mu setf mupad
diff --git a/runtime/syntax/mojo.vim b/runtime/syntax/mojo.vim
new file mode 100644
index 0000000000..b7dae24a15
--- /dev/null
+++ b/runtime/syntax/mojo.vim
@@ -0,0 +1,316 @@
+" 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:
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim
index 8285fa1e86..9e13777b7b 100644
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -456,6 +456,7 @@ def s:GetFilenameChecks(): dict<list<string>>
mrxvtrc: ['mrxvtrc', '.mrxvtrc'],
msidl: ['file.odl', 'file.mof'],
msql: ['file.msql'],
+ mojo: ['file.mojo', 'file.🔥'],
mupad: ['file.mu'],
mush: ['file.mush'],
muttrc: ['Muttngrc', 'Muttrc', '.muttngrc', '.muttngrc-file', '.muttrc',
diff --git a/src/version.c b/src/version.c
index 7f1d69d864..faeabfa6c6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1891,
+/**/
1890,
/**/
1889,