blob: 802cbe5538fdf12c7b1654825a8ca2f0066ca807 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Mathematica
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +00003" Maintainer: steve layland <layland@wolfram.com>
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +01004" Last Change: 2012 Feb 03 by Thilo Six
Riley Bruins0a083062024-06-03 20:40:45 +02005" 2024 May 24 by Riley Bruins <ribru17@gmail.com> (remove 'commentstring')
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00006" Source: http://members.wri.com/layland/vim/syntax/mma.vim
7" http://vim.sourceforge.net/scripts/script.php?script_id=1273
Bram Moolenaar5c736222010-01-06 20:54:52 +01008" Id: $Id: mma.vim,v 1.4 2006/04/14 20:40:38 vimboss Exp $
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +00009" NOTE:
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010010"
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000011" Empty .m files will automatically be presumed as Matlab files
12" unless you have the following in your .vimrc:
13"
14" let filetype_m="mma"
15"
Bram Moolenaar6c391a72021-09-09 21:55:11 +020016" I also recommend setting the default 'Comment' highlighting to something
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000017" other than the color used for 'Function', since both are plentiful in
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010018" most mathematica files, and they are often the same color (when using
Bram Moolenaar555b2802005-05-19 21:08:39 +000019" background=dark).
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000020"
21" Credits:
22" o Original Mathematica syntax version written by
23" Wolfgang Waltenberger <wwalten@ben.tuwien.ac.at>
24" o Some ideas like the CommentStar,CommentTitle were adapted
25" from the Java vim syntax file by Claudio Fleiner. Thanks!
26" o Everything else written by steve <layland@wolfram.com>
27"
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010028" Bugs:
29" o Vim 6.1 didn't really have support for character classes
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +000030" of other named character classes. For example, [\a\d]
31" didn't work. Therefore, a lot of this code uses explicit
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010032" character classes instead: [0-9a-zA-Z]
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +000033"
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000034" TODO:
35" folding
36" fix nesting
37" finish populating popular symbols
Bram Moolenaar071d4272004-06-13 20:20:40 +000038
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020039" quit when a syntax file was already loaded
40if exists("b:current_syntax")
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000041 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000042endif
43
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010044let s:cpo_save = &cpo
45set cpo&vim
46
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000047" Group Definitions:
48syntax cluster mmaNotes contains=mmaTodo,mmaFixme
49syntax cluster mmaComments contains=mmaComment,mmaFunctionComment,mmaItem,mmaFunctionTitle,mmaCommentStar
50syntax cluster mmaCommentStrings contains=mmaLooseQuote,mmaCommentString,mmaUnicode
51syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString
52syntax cluster mmaTop contains=mmaOperator,mmaGenericFunction,mmaPureFunction,mmaVariable
Bram Moolenaar071d4272004-06-13 20:20:40 +000053
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000054" Predefined Constants:
55" to list all predefined Symbols would be too insane...
56" it's probably smarter to define a select few, and get the rest from
57" context if absolutely necessary.
58" TODO - populate this with other often used Symbols
Bram Moolenaar071d4272004-06-13 20:20:40 +000059
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000060" standard fixed symbols:
61syntax keyword mmaVariable True False None Automatic All Null C General
Bram Moolenaar071d4272004-06-13 20:20:40 +000062
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000063" mathematical constants:
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010064syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000065
66" stream data / atomic heads:
67syntax keyword mmaVariable Byte Character Expression Number Real String Word EndOfFile Integer Symbol
68
69" sets:
70syntax keyword mmaVariable Integers Complexes Reals Booleans Rationals
71
72" character classes:
73syntax keyword mmaPattern DigitCharacter LetterCharacter WhitespaceCharacter WordCharacter EndOfString StartOfString EndOfLine StartOfLine WordBoundary
74
75" SelectionMove directions/units:
76syntax keyword mmaVariable Next Previous After Before Character Word Expression TextLine CellContents Cell CellGroup EvaluationCell ButtonCell GeneratedCell Notebook
77syntax keyword mmaVariable CellTags CellStyle CellLabel
78
79" TableForm positions:
80syntax keyword mmaVariable Above Below Left Right
81
82" colors:
83syntax keyword mmaVariable Black Blue Brown Cyan Gray Green Magenta Orange Pink Purple Red White Yellow
84
85" function attributes
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +010086syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000087
Bram Moolenaar555b2802005-05-19 21:08:39 +000088" Comment Sections:
89" this:
90" :that:
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +000091syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000092
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000093" Comment Keywords:
94syntax keyword mmaTodo TODO NOTE HEY contained
95syntax match mmaTodo "X\{3,}" contained
96syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +000097syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +000098" yay pirates...
99syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000100
Bram Moolenaar555b2802005-05-19 21:08:39 +0000101" EmPHAsis:
102" this unnecessary, but whatever :)
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000103syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis
104syntax match mmaemPHAsis "\%(^\|\s\)(\@<!\*[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*)\@!\*\%(\s\|$\)" contained contains=mmaemPHAsis
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000105
Bram Moolenaar555b2802005-05-19 21:08:39 +0000106" Regular Comments:
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000107" (* *)
108" allow nesting (* (* *) *) even though the frontend
109" won't always like it.
110syntax region mmaComment start=+(\*+ end=+\*)+ skipempty contains=@mmaNotes,mmaItem,@mmaCommentStrings,mmaemPHAsis,mmaComment
111
112" Function Comments:
Bram Moolenaar6c391a72021-09-09 21:55:11 +0200113" just like a normal comment except the first sentence is Special ala Java
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000114" (** *)
115" TODO - fix this for nesting, or not...
116syntax region mmaFunctionComment start="(\*\*\+" end="\*\+)" contains=@mmaNotes,mmaItem,mmaFunctionTitle,@mmaCommentStrings,mmaemPHAsis,mmaComment
117syntax region mmaFunctionTitle contained matchgroup=mmaFunctionComment start="\%((\*\*[ *]*\)" matchgroup=mmaFunctionTitle keepend end=".[.!-]\=\s*$" end="[.!-][ \t\r<&]"me=e-1 end="\%(\*\+)\)\@=" contained contains=@mmaNotes,mmaItem,mmaCommentStar
118
119" catch remaining (**********)'s
120syntax match mmaComment "(\*\*\+)"
121" catch preceding *
122syntax match mmaCommentStar "^\s*\*\+" contained
123
Bram Moolenaar555b2802005-05-19 21:08:39 +0000124" Variables:
125" Dollar sign variables
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000126syntax match mmaVariable "\$\a\+[0-9a-zA-Z$]*"
127
128" Preceding and Following Contexts
129syntax match mmaVariable "`[a-zA-Z$]\+[0-9a-zA-Z$]*" contains=mmaVariable
130syntax match mmaVariable "[a-zA-Z$]\+[0-9a-zA-Z$]*`" contains=mmaVariable
Bram Moolenaar555b2802005-05-19 21:08:39 +0000131
132" Strings:
133" "string"
134" 'string' is not accepted (until literal strings are supported!)
135syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+
136syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained
137
138
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000139" Patterns:
140" Each pattern marker below can be Blank[] (_), BlankSequence[] (__)
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100141" or BlankNullSequence[] (___). Most examples below can also be
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000142" combined, for example Pattern tests with Default values.
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100143"
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000144" _Head Anonymous patterns
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100145" name_Head
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000146" name:(_Head|_Head2) Named patterns
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100147"
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000148" _Head : val
149" name:_Head:val Default values
150"
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100151" _Head?testQ,
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000152" _Head?(test[#]&) Pattern tests
153"
154" name_Head/;test[name] Conditionals
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100155"
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000156" _Head:. Predefined Default
157"
158" .. ... Pattern Repeat
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100159
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000160syntax match mmaPatternError "\%(_\{4,}\|)\s*&\s*)\@!\)" contained
161
162"pattern name:
163syntax match mmaPattern "[A-Za-z0-9`]\+\s*:\+[=>]\@!" contains=mmaOperator
164"pattern default:
165syntax match mmaPattern ": *[^ ,]\+[\], ]\@=" contains=@mmaCommentStrings,@mmaTop,mmaOperator
166"pattern head/test:
167syntax match mmaPattern "[A-Za-z0-9`]*_\+\%(\a\+\)\=\%(?([^)]\+)\|?[^\]},]\+\)\=" contains=@mmaTop,@mmaCommentStrings,mmaPatternError
168
169" Operators:
170" /: ^= ^:= UpValue
171" /; Conditional
172" := = DownValue
173" == === ||
174" != =!= && Logic
175" >= <= < >
176" += -= *=
177" /= ++ -- Math
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100178" ^*
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000179" -> :> Rules
180" @@ @@@ Apply
181" /@ //@ Map
182" /. //. Replace
183" // @ Function application
184" <> ~~ String/Pattern join
185" ~ infix operator
186" . : Pattern operators
187syntax match mmaOperator "\%(@\{1,3}\|//[.@]\=\)"
188syntax match mmaOperator "\%(/[;:@.]\=\|\^\=:\==\)"
189syntax match mmaOperator "\%([-:=]\=>\|<=\=\)"
190"syntax match mmaOperator "\%(++\=\|--\=\|[/+-*]=\|[^*]\)"
191syntax match mmaOperator "[*+=^.:?-]"
192syntax match mmaOperator "\%(\~\~\=\)"
193syntax match mmaOperator "\%(=\{2,3}\|=\=!=\|||\=\|&&\|!\)" contains=ALLBUT,mmaPureFunction
194
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000195" Symbol Tags:
Bram Moolenaar555b2802005-05-19 21:08:39 +0000196" "SymbolName::item"
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000197"syntax match mmaSymbol "`\=[a-zA-Z$]\+[0-9a-zA-Z$]*\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*" contained
198syntax match mmaMessage "`\=\([a-zA-Z$]\+[0-9a-zA-Z$]*\)\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*::\a\+" contains=mmaMessageType
199syntax match mmaMessageType "::\a\+"hs=s+2 contained
Bram Moolenaar555b2802005-05-19 21:08:39 +0000200
201" Pure Functions:
202syntax match mmaPureFunction "#\%(#\|\d\+\)\="
203syntax match mmaPureFunction "&"
204
205" Named Functions:
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100206" Since everything is pretty much a function, get this straight
Bram Moolenaar555b2802005-05-19 21:08:39 +0000207" from context
208syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator
209syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring
210syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator
211
212" Numbers:
213syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>"
214syntax match mmaNumber "`\d\+\%(\d\@!\.\|\>\)"
215
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000216" Special Characters:
217" \[Name] named character
218" \ooo octal
219" \.xx 2 digit hex
220" \:xxxx 4 digit hex (multibyte unicode)
221syntax match mmaUnicode "\\\[\w\+\d*\]"
222syntax match mmaUnicode "\\\%(\x\{3}\|\.\x\{2}\|:\x\{4}\)"
223
224" Syntax Errors:
225syntax match mmaError "\*)" containedin=ALLBUT,@mmaComments,@mmaStrings
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000226syntax match mmaError "\%([/]{3,}\|[&:|+*?~-]\{3,}\|[.=]\{4,}\|_\@<=\.\{2,}\|`\{2,}\)" containedin=ALLBUT,@mmaComments,@mmaStrings
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000227
228" Punctuation:
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100229" things that shouldn't really be highlighted, or highlighted
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000230" in they're own group if you _really_ want. :)
231" ( ) { }
232" TODO - use Delimiter group?
233syntax match mmaBoring "[(){}]" contained
234
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000235" ------------------------------------
236" future explorations...
237" ------------------------------------
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000238" Function Arguments:
239" anything between brackets []
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000240" (fold)
241"syntax region mmaArgument start="\[" end="\]" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
242
243" Lists:
244" (fold)
245"syntax region mmaLists start="{" end="}" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
246
247" Regions:
248" (fold)
249"syntax region mmaRegion start="(\*\+[^<]*<!--[^>]*\*\+)" end="--> \*)" containedin=ALLBUT,@mmaStrings transparent fold keepend
250
251" show fold text
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000252"set foldtext=MmaFoldText()
253
254"function MmaFoldText()
255" let line = getline(v:foldstart)
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100256"
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000257" let lines = v:foldend-v:foldstart+1
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100258"
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000259" let sub = substitute(line, '(\*\+|\*\+)|[-*_]\+', '', 'g')
260"
261" if match(line, '(\*') != -1
262" let lines = lines.' line comment'
263" else
264" let lines = lines.' lines'
265" endif
266"
267" return v:folddashes.' '.lines.' '.sub
268"endf
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100269
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000270"this is slow for computing folds, but it does so accurately
271syntax sync fromstart
272
273" but this seems to do alright for non fold syntax coloring.
274" for folding, however, it doesn't get the nesting right.
275" TODO - find sync group for multiline modules? ick...
276
277" sync multi line comments
278"syntax sync match syncComments groupthere NONE "\*)"
279"syntax sync match syncComments groupthere mmaComment "(\*"
280
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000281"set foldmethod=syntax
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000282"set foldnestmax=1
283"set foldminlines=15
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200286" NOTE - the following links are not guaranteed to
287" look good under all colorschemes. You might need to
288" :so $VIMRUNTIME/syntax/hitest.vim and tweak these to
289" look good in yours
Bram Moolenaar34cdc3e2005-05-18 22:24:46 +0000290
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000291
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200292hi def link mmaComment Comment
293hi def link mmaCommentStar Comment
294hi def link mmaFunctionComment Comment
295hi def link mmaLooseQuote Comment
296hi def link mmaGenericFunction Function
297hi def link mmaVariable Identifier
298" hi def link mmaSymbol Identifier
299hi def link mmaOperator Operator
300hi def link mmaPatternOp Operator
301hi def link mmaPureFunction Operator
302hi def link mmaString String
303hi def link mmaCommentString String
304hi def link mmaUnicode String
305hi def link mmaMessage Type
306hi def link mmaNumber Type
307hi def link mmaPattern Type
308hi def link mmaError Error
309hi def link mmaFixme Error
310hi def link mmaPatternError Error
311hi def link mmaTodo Todo
312hi def link mmaemPHAsis Special
313hi def link mmaFunctionTitle Special
314hi def link mmaMessageType Special
315hi def link mmaItem Preproc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316
Bram Moolenaar071d4272004-06-13 20:20:40 +0000317
318let b:current_syntax = "mma"
Bram Moolenaarb8ff1fb2012-02-04 21:59:01 +0100319
320let &cpo = s:cpo_save
321unlet s:cpo_save