neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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