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