mma.vim (11863B)
1 " Vim syntax file 2 " Language: Mathematica 3 " Maintainer: steve layland <layland@wolfram.com> 4 " Last Change: 2012 Feb 03 by Thilo Six 5 " 2024 May 24 by Riley Bruins <ribru17@gmail.com> (remove 'commentstring') 6 " Source: http://members.wri.com/layland/vim/syntax/mma.vim 7 " http://vim.sourceforge.net/scripts/script.php?script_id=1273 8 " Id: $Id: mma.vim,v 1.4 2006/04/14 20:40:38 vimboss Exp $ 9 " NOTE: 10 " 11 " 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 " 16 " I also recommend setting the default 'Comment' highlighting to something 17 " other than the color used for 'Function', since both are plentiful in 18 " most mathematica files, and they are often the same color (when using 19 " background=dark). 20 " 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 " 28 " Bugs: 29 " o Vim 6.1 didn't really have support for character classes 30 " of other named character classes. For example, [\a\d] 31 " didn't work. Therefore, a lot of this code uses explicit 32 " character classes instead: [0-9a-zA-Z] 33 " 34 " TODO: 35 " folding 36 " fix nesting 37 " finish populating popular symbols 38 39 " quit when a syntax file was already loaded 40 if exists("b:current_syntax") 41 finish 42 endif 43 44 let s:cpo_save = &cpo 45 set cpo&vim 46 47 " Group Definitions: 48 syntax cluster mmaNotes contains=mmaTodo,mmaFixme 49 syntax cluster mmaComments contains=mmaComment,mmaFunctionComment,mmaItem,mmaFunctionTitle,mmaCommentStar 50 syntax cluster mmaCommentStrings contains=mmaLooseQuote,mmaCommentString,mmaUnicode 51 syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString 52 syntax 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: 61 syntax keyword mmaVariable True False None Automatic All Null C General 62 63 " mathematical constants: 64 syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher 65 66 " stream data / atomic heads: 67 syntax keyword mmaVariable Byte Character Expression Number Real String Word EndOfFile Integer Symbol 68 69 " sets: 70 syntax keyword mmaVariable Integers Complexes Reals Booleans Rationals 71 72 " character classes: 73 syntax keyword mmaPattern DigitCharacter LetterCharacter WhitespaceCharacter WordCharacter EndOfString StartOfString EndOfLine StartOfLine WordBoundary 74 75 " SelectionMove directions/units: 76 syntax keyword mmaVariable Next Previous After Before Character Word Expression TextLine CellContents Cell CellGroup EvaluationCell ButtonCell GeneratedCell Notebook 77 syntax keyword mmaVariable CellTags CellStyle CellLabel 78 79 " TableForm positions: 80 syntax keyword mmaVariable Above Below Left Right 81 82 " colors: 83 syntax keyword mmaVariable Black Blue Brown Cyan Gray Green Magenta Orange Pink Purple Red White Yellow 84 85 " function attributes 86 syntax 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: 91 syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes 92 93 " Comment Keywords: 94 syntax keyword mmaTodo TODO NOTE HEY contained 95 syntax match mmaTodo "X\{3,}" contained 96 syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained 97 syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained 98 " yay pirates... 99 syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained 100 101 " EmPHAsis: 102 " this unnecessary, but whatever :) 103 syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis 104 syntax 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. 110 syntax region mmaComment start=+(\*+ end=+\*)+ skipempty contains=@mmaNotes,mmaItem,@mmaCommentStrings,mmaemPHAsis,mmaComment 111 112 " Function Comments: 113 " just like a normal comment except the first sentence is Special ala Java 114 " (** *) 115 " TODO - fix this for nesting, or not... 116 syntax region mmaFunctionComment start="(\*\*\+" end="\*\+)" contains=@mmaNotes,mmaItem,mmaFunctionTitle,@mmaCommentStrings,mmaemPHAsis,mmaComment 117 syntax 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 120 syntax match mmaComment "(\*\*\+)" 121 " catch preceding * 122 syntax match mmaCommentStar "^\s*\*\+" contained 123 124 " Variables: 125 " Dollar sign variables 126 syntax match mmaVariable "\$\a\+[0-9a-zA-Z$]*" 127 128 " Preceding and Following Contexts 129 syntax match mmaVariable "`[a-zA-Z$]\+[0-9a-zA-Z$]*" contains=mmaVariable 130 syntax 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!) 135 syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ 136 syntax 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 160 syntax match mmaPatternError "\%(_\{4,}\|)\s*&\s*)\@!\)" contained 161 162 "pattern name: 163 syntax match mmaPattern "[A-Za-z0-9`]\+\s*:\+[=>]\@!" contains=mmaOperator 164 "pattern default: 165 syntax match mmaPattern ": *[^ ,]\+[\], ]\@=" contains=@mmaCommentStrings,@mmaTop,mmaOperator 166 "pattern head/test: 167 syntax 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 187 syntax match mmaOperator "\%(@\{1,3}\|//[.@]\=\)" 188 syntax match mmaOperator "\%(/[;:@.]\=\|\^\=:\==\)" 189 syntax match mmaOperator "\%([-:=]\=>\|<=\=\)" 190 "syntax match mmaOperator "\%(++\=\|--\=\|[/+-*]=\|[^*]\)" 191 syntax match mmaOperator "[*+=^.:?-]" 192 syntax match mmaOperator "\%(\~\~\=\)" 193 syntax 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 198 syntax match mmaMessage "`\=\([a-zA-Z$]\+[0-9a-zA-Z$]*\)\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*::\a\+" contains=mmaMessageType 199 syntax match mmaMessageType "::\a\+"hs=s+2 contained 200 201 " Pure Functions: 202 syntax match mmaPureFunction "#\%(#\|\d\+\)\=" 203 syntax match mmaPureFunction "&" 204 205 " Named Functions: 206 " Since everything is pretty much a function, get this straight 207 " from context 208 syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator 209 syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring 210 syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator 211 212 " Numbers: 213 syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>" 214 syntax 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) 221 syntax match mmaUnicode "\\\[\w\+\d*\]" 222 syntax match mmaUnicode "\\\%(\x\{3}\|\.\x\{2}\|:\x\{4}\)" 223 224 " Syntax Errors: 225 syntax match mmaError "\*)" containedin=ALLBUT,@mmaComments,@mmaStrings 226 syntax 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? 233 syntax 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 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 271 syntax 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 292 hi def link mmaComment Comment 293 hi def link mmaCommentStar Comment 294 hi def link mmaFunctionComment Comment 295 hi def link mmaLooseQuote Comment 296 hi def link mmaGenericFunction Function 297 hi def link mmaVariable Identifier 298 " hi def link mmaSymbol Identifier 299 hi def link mmaOperator Operator 300 hi def link mmaPatternOp Operator 301 hi def link mmaPureFunction Operator 302 hi def link mmaString String 303 hi def link mmaCommentString String 304 hi def link mmaUnicode String 305 hi def link mmaMessage Type 306 hi def link mmaNumber Type 307 hi def link mmaPattern Type 308 hi def link mmaError Error 309 hi def link mmaFixme Error 310 hi def link mmaPatternError Error 311 hi def link mmaTodo Todo 312 hi def link mmaemPHAsis Special 313 hi def link mmaFunctionTitle Special 314 hi def link mmaMessageType Special 315 hi def link mmaItem Preproc 316 317 318 let b:current_syntax = "mma" 319 320 let &cpo = s:cpo_save 321 unlet s:cpo_save