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 38" quit when a syntax file was already loaded 39if exists("b:current_syntax") 40 finish 41endif 42 43let s:cpo_save = &cpo 44set cpo&vim 45 46" Group Definitions: 47syntax cluster mmaNotes contains=mmaTodo,mmaFixme 48syntax cluster mmaComments contains=mmaComment,mmaFunctionComment,mmaItem,mmaFunctionTitle,mmaCommentStar 49syntax cluster mmaCommentStrings contains=mmaLooseQuote,mmaCommentString,mmaUnicode 50syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString 51syntax cluster mmaTop contains=mmaOperator,mmaGenericFunction,mmaPureFunction,mmaVariable 52 53" Predefined Constants: 54" to list all predefined Symbols would be too insane... 55" it's probably smarter to define a select few, and get the rest from 56" context if absolutely necessary. 57" TODO - populate this with other often used Symbols 58 59" standard fixed symbols: 60syntax keyword mmaVariable True False None Automatic All Null C General 61 62" mathematical constants: 63syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher 64 65" stream data / atomic heads: 66syntax keyword mmaVariable Byte Character Expression Number Real String Word EndOfFile Integer Symbol 67 68" sets: 69syntax keyword mmaVariable Integers Complexes Reals Booleans Rationals 70 71" character classes: 72syntax keyword mmaPattern DigitCharacter LetterCharacter WhitespaceCharacter WordCharacter EndOfString StartOfString EndOfLine StartOfLine WordBoundary 73 74" SelectionMove directions/units: 75syntax keyword mmaVariable Next Previous After Before Character Word Expression TextLine CellContents Cell CellGroup EvaluationCell ButtonCell GeneratedCell Notebook 76syntax keyword mmaVariable CellTags CellStyle CellLabel 77 78" TableForm positions: 79syntax keyword mmaVariable Above Below Left Right 80 81" colors: 82syntax keyword mmaVariable Black Blue Brown Cyan Gray Green Magenta Orange Pink Purple Red White Yellow 83 84" function attributes 85syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub 86 87" Comment Sections: 88" this: 89" :that: 90syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes 91 92" Comment Keywords: 93syntax keyword mmaTodo TODO NOTE HEY contained 94syntax match mmaTodo "X\{3,}" contained 95syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained 96syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained 97" yay pirates... 98syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained 99 100" EmPHAsis: 101" this unnecessary, but whatever :) 102syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis 103syntax match mmaemPHAsis "\%(^\|\s\)(\@<!\*[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*)\@!\*\%(\s\|$\)" contained contains=mmaemPHAsis 104 105" Regular Comments: 106" (* *) 107" allow nesting (* (* *) *) even though the frontend 108" won't always like it. 109syntax region mmaComment start=+(\*+ end=+\*)+ skipempty contains=@mmaNotes,mmaItem,@mmaCommentStrings,mmaemPHAsis,mmaComment 110 111" Function Comments: 112" just like a normal comment except the first sentance is Special ala Java 113" (** *) 114" TODO - fix this for nesting, or not... 115syntax region mmaFunctionComment start="(\*\*\+" end="\*\+)" contains=@mmaNotes,mmaItem,mmaFunctionTitle,@mmaCommentStrings,mmaemPHAsis,mmaComment 116syntax region mmaFunctionTitle contained matchgroup=mmaFunctionComment start="\%((\*\*[ *]*\)" matchgroup=mmaFunctionTitle keepend end=".[.!-]\=\s*$" end="[.!-][ \t\r<&]"me=e-1 end="\%(\*\+)\)\@=" contained contains=@mmaNotes,mmaItem,mmaCommentStar 117 118" catch remaining (**********)'s 119syntax match mmaComment "(\*\*\+)" 120" catch preceding * 121syntax match mmaCommentStar "^\s*\*\+" contained 122 123" Variables: 124" Dollar sign variables 125syntax match mmaVariable "\$\a\+[0-9a-zA-Z$]*" 126 127" Preceding and Following Contexts 128syntax match mmaVariable "`[a-zA-Z$]\+[0-9a-zA-Z$]*" contains=mmaVariable 129syntax match mmaVariable "[a-zA-Z$]\+[0-9a-zA-Z$]*`" contains=mmaVariable 130 131" Strings: 132" "string" 133" 'string' is not accepted (until literal strings are supported!) 134syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ 135syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained 136 137 138" Patterns: 139" Each pattern marker below can be Blank[] (_), BlankSequence[] (__) 140" or BlankNullSequence[] (___). Most examples below can also be 141" combined, for example Pattern tests with Default values. 142" 143" _Head Anonymous patterns 144" name_Head 145" name:(_Head|_Head2) Named patterns 146" 147" _Head : val 148" name:_Head:val Default values 149" 150" _Head?testQ, 151" _Head?(test[#]&) Pattern tests 152" 153" name_Head/;test[name] Conditionals 154" 155" _Head:. Predefined Default 156" 157" .. ... Pattern Repeat 158 159syntax match mmaPatternError "\%(_\{4,}\|)\s*&\s*)\@!\)" contained 160 161"pattern name: 162syntax match mmaPattern "[A-Za-z0-9`]\+\s*:\+[=>]\@!" contains=mmaOperator 163"pattern default: 164syntax match mmaPattern ": *[^ ,]\+[\], ]\@=" contains=@mmaCommentStrings,@mmaTop,mmaOperator 165"pattern head/test: 166syntax match mmaPattern "[A-Za-z0-9`]*_\+\%(\a\+\)\=\%(?([^)]\+)\|?[^\]},]\+\)\=" contains=@mmaTop,@mmaCommentStrings,mmaPatternError 167 168" Operators: 169" /: ^= ^:= UpValue 170" /; Conditional 171" := = DownValue 172" == === || 173" != =!= && Logic 174" >= <= < > 175" += -= *= 176" /= ++ -- Math 177" ^* 178" -> :> Rules 179" @@ @@@ Apply 180" /@ //@ Map 181" /. //. Replace 182" // @ Function application 183" <> ~~ String/Pattern join 184" ~ infix operator 185" . : Pattern operators 186syntax match mmaOperator "\%(@\{1,3}\|//[.@]\=\)" 187syntax match mmaOperator "\%(/[;:@.]\=\|\^\=:\==\)" 188syntax match mmaOperator "\%([-:=]\=>\|<=\=\)" 189"syntax match mmaOperator "\%(++\=\|--\=\|[/+-*]=\|[^*]\)" 190syntax match mmaOperator "[*+=^.:?-]" 191syntax match mmaOperator "\%(\~\~\=\)" 192syntax match mmaOperator "\%(=\{2,3}\|=\=!=\|||\=\|&&\|!\)" contains=ALLBUT,mmaPureFunction 193 194" Symbol Tags: 195" "SymbolName::item" 196"syntax match mmaSymbol "`\=[a-zA-Z$]\+[0-9a-zA-Z$]*\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*" contained 197syntax match mmaMessage "`\=\([a-zA-Z$]\+[0-9a-zA-Z$]*\)\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*::\a\+" contains=mmaMessageType 198syntax match mmaMessageType "::\a\+"hs=s+2 contained 199 200" Pure Functions: 201syntax match mmaPureFunction "#\%(#\|\d\+\)\=" 202syntax match mmaPureFunction "&" 203 204" Named Functions: 205" Since everything is pretty much a function, get this straight 206" from context 207syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator 208syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring 209syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator 210 211" Numbers: 212syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>" 213syntax match mmaNumber "`\d\+\%(\d\@!\.\|\>\)" 214 215" Special Characters: 216" \[Name] named character 217" \ooo octal 218" \.xx 2 digit hex 219" \:xxxx 4 digit hex (multibyte unicode) 220syntax match mmaUnicode "\\\[\w\+\d*\]" 221syntax match mmaUnicode "\\\%(\x\{3}\|\.\x\{2}\|:\x\{4}\)" 222 223" Syntax Errors: 224syntax match mmaError "\*)" containedin=ALLBUT,@mmaComments,@mmaStrings 225syntax match mmaError "\%([/]{3,}\|[&:|+*?~-]\{3,}\|[.=]\{4,}\|_\@<=\.\{2,}\|`\{2,}\)" containedin=ALLBUT,@mmaComments,@mmaStrings 226 227" Punctuation: 228" things that shouldn't really be highlighted, or highlighted 229" in they're own group if you _really_ want. :) 230" ( ) { } 231" TODO - use Delimiter group? 232syntax match mmaBoring "[(){}]" contained 233 234" ------------------------------------ 235" future explorations... 236" ------------------------------------ 237" Function Arguments: 238" anything between brackets [] 239" (fold) 240"syntax region mmaArgument start="\[" end="\]" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold 241 242" Lists: 243" (fold) 244"syntax region mmaLists start="{" end="}" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold 245 246" Regions: 247" (fold) 248"syntax region mmaRegion start="(\*\+[^<]*<!--[^>]*\*\+)" end="--> \*)" containedin=ALLBUT,@mmaStrings transparent fold keepend 249 250" show fold text 251set commentstring='(*%s*)' 252"set foldtext=MmaFoldText() 253 254"function MmaFoldText() 255" let line = getline(v:foldstart) 256" 257" let lines = v:foldend-v:foldstart+1 258" 259" 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 269 270"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 281"set foldmethod=syntax 282"set foldnestmax=1 283"set foldminlines=15 284 285 286" 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 290 291 292hi 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 316 317 318let b:current_syntax = "mma" 319 320let &cpo = s:cpo_save 321unlet s:cpo_save 322