xref: /vim-8.2.3635/runtime/syntax/mma.vim (revision cf2d8dee)
1" Vim syntax file
2" Language:     Mathematica
3" Maintainer:   steve layland <[email protected]>
4" Last Change:  2012 Feb 03 by Thilo Six
5" Source:       http://members.wri.com/layland/vim/syntax/mma.vim
6"               http://vim.sourceforge.net/scripts/script.php?script_id=1273
7" Id:           $Id: mma.vim,v 1.4 2006/04/14 20:40:38 vimboss Exp $
8" NOTE:
9"
10" Empty .m files will automatically be presumed as Matlab files
11" unless you have the following in your .vimrc:
12"
13"       let filetype_m="mma"
14"
15" I also recommend setting the default 'Comment' hilighting to something
16" other than the color used for 'Function', since both are plentiful in
17" most mathematica files, and they are often the same color (when using
18" background=dark).
19"
20" Credits:
21" o  Original Mathematica syntax version written by
22"    Wolfgang Waltenberger <[email protected]>
23" o  Some ideas like the CommentStar,CommentTitle were adapted
24"    from the Java vim syntax file by Claudio Fleiner.  Thanks!
25" o  Everything else written by steve <[email protected]>
26"
27" Bugs:
28" o  Vim 6.1 didn't really have support for character classes
29"    of other named character classes.  For example, [\a\d]
30"    didn't work.  Therefore, a lot of this code uses explicit
31"    character classes instead: [0-9a-zA-Z]
32"
33" TODO:
34"   folding
35"   fix nesting
36"   finish populating popular symbols
37
38if version < 600
39	syntax clear
40elseif exists("b:current_syntax")
41    finish
42endif
43
44let s:cpo_save = &cpo
45set cpo&vim
46
47" 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
53
54" 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
59
60" standard fixed symbols:
61syntax keyword mmaVariable True False None Automatic All Null C General
62
63" mathematical constants:
64syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher
65
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
86syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub
87
88" Comment Sections:
89"   this:
90"   :that:
91syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes
92
93" Comment Keywords:
94syntax keyword mmaTodo TODO NOTE HEY contained
95syntax match mmaTodo "X\{3,}" contained
96syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained
97syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained
98" yay pirates...
99syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained
100
101" EmPHAsis:
102" this unnecessary, but whatever :)
103syntax 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
105
106" Regular Comments:
107"   (* *)
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:
113"   just like a normal comment except the first sentance is Special ala Java
114"   (** *)
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
124" Variables:
125"   Dollar sign variables
126syntax 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
131
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
139" Patterns:
140"   Each pattern marker below can be Blank[] (_), BlankSequence[] (__)
141"   or BlankNullSequence[] (___).  Most examples below can also be
142"   combined, for example Pattern tests with Default values.
143"
144"   _Head                   Anonymous patterns
145"   name_Head
146"   name:(_Head|_Head2)     Named patterns
147"
148"   _Head : val
149"   name:_Head:val          Default values
150"
151"   _Head?testQ,
152"   _Head?(test[#]&)        Pattern tests
153"
154"   name_Head/;test[name]   Conditionals
155"
156"   _Head:.                 Predefined Default
157"
158"   .. ...                  Pattern Repeat
159
160syntax 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
178"   ^*
179"   -> :>       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
195" Symbol Tags:
196"   "SymbolName::item"
197"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
200
201" Pure Functions:
202syntax match mmaPureFunction "#\%(#\|\d\+\)\="
203syntax match mmaPureFunction "&"
204
205" Named Functions:
206" Since everything is pretty much a function, get this straight
207" 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
216" 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
226syntax match mmaError "\%([/]{3,}\|[&:|+*?~-]\{3,}\|[.=]\{4,}\|_\@<=\.\{2,}\|`\{2,}\)" containedin=ALLBUT,@mmaComments,@mmaStrings
227
228" Punctuation:
229" things that shouldn't really be highlighted, or highlighted
230" in they're own group if you _really_ want. :)
231"  ( ) { }
232" TODO - use Delimiter group?
233syntax match mmaBoring "[(){}]" contained
234
235" ------------------------------------
236"    future explorations...
237" ------------------------------------
238" Function Arguments:
239"   anything between brackets []
240"   (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
252set commentstring='(*%s*)'
253"set foldtext=MmaFoldText()
254
255"function MmaFoldText()
256"    let line = getline(v:foldstart)
257"
258"    let lines = v:foldend-v:foldstart+1
259"
260"    let sub = substitute(line, '(\*\+|\*\+)|[-*_]\+', '', 'g')
261"
262"    if match(line, '(\*') != -1
263"        let lines = lines.' line comment'
264"    else
265"        let lines = lines.' lines'
266"    endif
267"
268"    return v:folddashes.' '.lines.' '.sub
269"endf
270
271"this is slow for computing folds, but it does so accurately
272syntax sync fromstart
273
274" but this seems to do alright for non fold syntax coloring.
275" for folding, however, it doesn't get the nesting right.
276" TODO - find sync group for multiline modules? ick...
277
278" sync multi line comments
279"syntax sync match syncComments groupthere NONE "\*)"
280"syntax sync match syncComments groupthere mmaComment "(\*"
281
282"set foldmethod=syntax
283"set foldnestmax=1
284"set foldminlines=15
285
286if version >= 508 || !exists("did_mma_syn_inits")
287	if version < 508
288		let did_mma_syn_inits = 1
289		command -nargs=+ HiLink hi link <args>
290	else
291		command -nargs=+ HiLink hi def link <args>
292	endif
293
294    " NOTE - the following links are not guaranteed to
295    " look good under all colorschemes.  You might need to
296    " :so $VIMRUNTIME/syntax/hitest.vim and tweak these to
297    " look good in yours
298
299
300    HiLink mmaComment           Comment
301    HiLink mmaCommentStar       Comment
302    HiLink mmaFunctionComment   Comment
303    HiLink mmaLooseQuote        Comment
304	HiLink mmaGenericFunction   Function
305	HiLink mmaVariable          Identifier
306"    HiLink mmaSymbol            Identifier
307	HiLink mmaOperator          Operator
308    HiLink mmaPatternOp         Operator
309	HiLink mmaPureFunction      Operator
310	HiLink mmaString            String
311    HiLink mmaCommentString     String
312	HiLink mmaUnicode           String
313	HiLink mmaMessage           Type
314    HiLink mmaNumber            Type
315	HiLink mmaPattern           Type
316	HiLink mmaError             Error
317	HiLink mmaFixme             Error
318    HiLink mmaPatternError      Error
319    HiLink mmaTodo              Todo
320    HiLink mmaemPHAsis          Special
321    HiLink mmaFunctionTitle     Special
322    HiLink mmaMessageType       Special
323    HiLink mmaItem              Preproc
324
325	delcommand HiLink
326endif
327
328let b:current_syntax = "mma"
329
330let &cpo = s:cpo_save
331unlet s:cpo_save
332