Skip to content

Commit 0ce2c59

Browse files
mahmoudajawadchrisbra
authored andcommitted
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]>
1 parent f36bbcd commit 0ce2c59

4 files changed

Lines changed: 323 additions & 0 deletions

File tree

runtime/filetype.vim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,10 @@ au BufNewFile,BufRead *.rc,*.rch
13681368
\ setf rc |
13691369
\ endif
13701370

1371+
" Mojo
1372+
" Mojo files use either .mojo or .🔥 as extension
1373+
au BufNewFile,BufRead *.mojo,*.🔥 setf mojo
1374+
13711375
" MuPAD source
13721376
au BufRead,BufNewFile *.mu setf mupad
13731377

runtime/syntax/mojo.vim

Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,316 @@
1+
" Vim syntax file
2+
" Language: Mojo
3+
" Maintainer: Mahmoud Abduljawad <[email protected]>
4+
" Last Change: 2023 Sep 09
5+
" Credits: Mahmoud Abduljawad <[email protected]>
6+
" Neil Schemenauer <[email protected]>
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:

src/testdir/test_filetype.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ def s:GetFilenameChecks(): dict<list<string>>
456456
mrxvtrc: ['mrxvtrc', '.mrxvtrc'],
457457
msidl: ['file.odl', 'file.mof'],
458458
msql: ['file.msql'],
459+
mojo: ['file.mojo', 'file.🔥'],
459460
mupad: ['file.mu'],
460461
mush: ['file.mush'],
461462
muttrc: ['Muttngrc', 'Muttrc', '.muttngrc', '.muttngrc-file', '.muttrc',

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,8 @@ static char *(features[]) =
699699

700700
static int included_patches[] =
701701
{ /* Add new patch number below this line */
702+
/**/
703+
1891,
702704
/**/
703705
1890,
704706
/**/

0 commit comments

Comments
 (0)