patch 9.0.1891: No runtime support for Mojo

Commit: 
https://github.com/vim/vim/commit/0ce2c594d0704f27a16d2c13fce85d596cc91489
Author: Mahmoud Abduljawad <[email protected]>
Date:   Sun Sep 10 18:23:04 2023 +0200

    patch 9.0.1891: No runtime support for Mojo
    
    Problem:  No runtime support for Mojo
    Solution: Add basic filetype and syntax plugins
    
    closes: #13062
    closes: #13063
    
    Signed-off-by: Christian Brabandt <[email protected]>
    Signed-off-by: Doug Kearns <[email protected]>
    Co-authored-by: Mahmoud Abduljawad <[email protected]>

diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 81764c1b5..9b7e698c2 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 000000000..b7dae24a1
--- /dev/null
+++ b/runtime/syntax/mojo.vim
@@ -0,0 +1,316 @@
+" Vim syntax file
+" Language:    Mojo
+" Maintainer:  Mahmoud Abduljawad <[email protected]>
+" Last Change: 2023 Sep 09
+" Credits:     Mahmoud Abduljawad <[email protected]>
+"              Neil Schemenauer <[email protected]>
+"              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*
\%(\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*
\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}
\%(\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{ \+\%(\s \+\)*}" 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 " \+    "
+  syn match   mojoSpaceError   display "       \+ "
+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 8285fa1e8..9e13777b7 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 7f1d69d86..faeabfa6c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1891,
 /**/
     1890,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1qfNK2-006KcU-6V%40256bit.org.

Raspunde prin e-mail lui