mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			322 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " Vim syntax file
 | |
| " Language:     Mathematica
 | |
| " Maintainer:   steve layland <layland@wolfram.com>
 | |
| " Last Change:  2012 Feb 03 by Thilo Six
 | |
| " Source:       http://members.wri.com/layland/vim/syntax/mma.vim
 | |
| "               http://vim.sourceforge.net/scripts/script.php?script_id=1273
 | |
| " Id:           $Id: mma.vim,v 1.4 2006/04/14 20:40:38 vimboss Exp $
 | |
| " NOTE:
 | |
| "
 | |
| " Empty .m files will automatically be presumed as Matlab files
 | |
| " unless you have the following in your .vimrc:
 | |
| "
 | |
| "       let filetype_m="mma"
 | |
| "
 | |
| " I also recommend setting the default 'Comment' highlighting to something
 | |
| " other than the color used for 'Function', since both are plentiful in
 | |
| " most mathematica files, and they are often the same color (when using
 | |
| " background=dark).
 | |
| "
 | |
| " Credits:
 | |
| " o  Original Mathematica syntax version written by
 | |
| "    Wolfgang Waltenberger <wwalten@ben.tuwien.ac.at>
 | |
| " o  Some ideas like the CommentStar,CommentTitle were adapted
 | |
| "    from the Java vim syntax file by Claudio Fleiner.  Thanks!
 | |
| " o  Everything else written by steve <layland@wolfram.com>
 | |
| "
 | |
| " Bugs:
 | |
| " o  Vim 6.1 didn't really have support for character classes
 | |
| "    of other named character classes.  For example, [\a\d]
 | |
| "    didn't work.  Therefore, a lot of this code uses explicit
 | |
| "    character classes instead: [0-9a-zA-Z]
 | |
| "
 | |
| " TODO:
 | |
| "   folding
 | |
| "   fix nesting
 | |
| "   finish populating popular symbols
 | |
| 
 | |
| " quit when a syntax file was already loaded
 | |
| if exists("b:current_syntax")
 | |
|     finish
 | |
| endif
 | |
| 
 | |
| let s:cpo_save = &cpo
 | |
| set cpo&vim
 | |
| 
 | |
| " Group Definitions:
 | |
| syntax cluster mmaNotes contains=mmaTodo,mmaFixme
 | |
| syntax cluster mmaComments contains=mmaComment,mmaFunctionComment,mmaItem,mmaFunctionTitle,mmaCommentStar
 | |
| syntax cluster mmaCommentStrings contains=mmaLooseQuote,mmaCommentString,mmaUnicode
 | |
| syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString
 | |
| syntax cluster mmaTop contains=mmaOperator,mmaGenericFunction,mmaPureFunction,mmaVariable
 | |
| 
 | |
| " Predefined Constants:
 | |
| "   to list all predefined Symbols would be too insane...
 | |
| "   it's probably smarter to define a select few, and get the rest from
 | |
| "   context if absolutely necessary.
 | |
| "   TODO - populate this with other often used Symbols
 | |
| 
 | |
| " standard fixed symbols:
 | |
| syntax keyword mmaVariable True False None Automatic All Null C General
 | |
| 
 | |
| " mathematical constants:
 | |
| syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher
 | |
| 
 | |
| " stream data / atomic heads:
 | |
| syntax keyword mmaVariable Byte Character Expression Number Real String Word EndOfFile Integer Symbol
 | |
| 
 | |
| " sets:
 | |
| syntax keyword mmaVariable Integers Complexes Reals Booleans Rationals
 | |
| 
 | |
| " character classes:
 | |
| syntax keyword mmaPattern DigitCharacter LetterCharacter WhitespaceCharacter WordCharacter EndOfString StartOfString EndOfLine StartOfLine WordBoundary
 | |
| 
 | |
| " SelectionMove directions/units:
 | |
| syntax keyword mmaVariable Next Previous After Before Character Word Expression TextLine CellContents Cell CellGroup EvaluationCell ButtonCell GeneratedCell Notebook
 | |
| syntax keyword mmaVariable CellTags CellStyle CellLabel
 | |
| 
 | |
| " TableForm positions:
 | |
| syntax keyword mmaVariable Above Below Left Right
 | |
| 
 | |
| " colors:
 | |
| syntax keyword mmaVariable Black Blue Brown Cyan Gray Green Magenta Orange Pink Purple Red White Yellow
 | |
| 
 | |
| " function attributes
 | |
| syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub
 | |
| 
 | |
| " Comment Sections:
 | |
| "   this:
 | |
| "   :that:
 | |
| syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes
 | |
| 
 | |
| " Comment Keywords:
 | |
| syntax keyword mmaTodo TODO NOTE HEY contained
 | |
| syntax match mmaTodo "X\{3,}" contained
 | |
| syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained
 | |
| syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained
 | |
| " yay pirates...
 | |
| syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained
 | |
| 
 | |
| " EmPHAsis:
 | |
| " this unnecessary, but whatever :)
 | |
| syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis
 | |
| syntax match mmaemPHAsis "\%(^\|\s\)(\@<!\*[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*)\@!\*\%(\s\|$\)" contained contains=mmaemPHAsis
 | |
| 
 | |
| " Regular Comments:
 | |
| "   (* *)
 | |
| "   allow nesting (* (* *) *) even though the frontend
 | |
| "   won't always like it.
 | |
| syntax region mmaComment start=+(\*+ end=+\*)+ skipempty contains=@mmaNotes,mmaItem,@mmaCommentStrings,mmaemPHAsis,mmaComment
 | |
| 
 | |
| " Function Comments:
 | |
| "   just like a normal comment except the first sentence is Special ala Java
 | |
| "   (** *)
 | |
| "   TODO - fix this for nesting, or not...
 | |
| syntax region mmaFunctionComment start="(\*\*\+" end="\*\+)" contains=@mmaNotes,mmaItem,mmaFunctionTitle,@mmaCommentStrings,mmaemPHAsis,mmaComment
 | |
| syntax region mmaFunctionTitle contained matchgroup=mmaFunctionComment start="\%((\*\*[ *]*\)" matchgroup=mmaFunctionTitle keepend end=".[.!-]\=\s*$" end="[.!-][ \t\r<&]"me=e-1 end="\%(\*\+)\)\@=" contained contains=@mmaNotes,mmaItem,mmaCommentStar
 | |
| 
 | |
| " catch remaining (**********)'s
 | |
| syntax match mmaComment "(\*\*\+)"
 | |
| " catch preceding *
 | |
| syntax match mmaCommentStar "^\s*\*\+" contained
 | |
| 
 | |
| " Variables:
 | |
| "   Dollar sign variables
 | |
| syntax match mmaVariable "\$\a\+[0-9a-zA-Z$]*"
 | |
| 
 | |
| "   Preceding and Following Contexts
 | |
| syntax match mmaVariable "`[a-zA-Z$]\+[0-9a-zA-Z$]*" contains=mmaVariable
 | |
| syntax match mmaVariable "[a-zA-Z$]\+[0-9a-zA-Z$]*`" contains=mmaVariable
 | |
| 
 | |
| " Strings:
 | |
| "   "string"
 | |
| "   'string' is not accepted (until literal strings are supported!)
 | |
| syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+
 | |
| syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained
 | |
| 
 | |
| 
 | |
| " Patterns:
 | |
| "   Each pattern marker below can be Blank[] (_), BlankSequence[] (__)
 | |
| "   or BlankNullSequence[] (___).  Most examples below can also be
 | |
| "   combined, for example Pattern tests with Default values.
 | |
| "
 | |
| "   _Head                   Anonymous patterns
 | |
| "   name_Head
 | |
| "   name:(_Head|_Head2)     Named patterns
 | |
| "
 | |
| "   _Head : val
 | |
| "   name:_Head:val          Default values
 | |
| "
 | |
| "   _Head?testQ,
 | |
| "   _Head?(test[#]&)        Pattern tests
 | |
| "
 | |
| "   name_Head/;test[name]   Conditionals
 | |
| "
 | |
| "   _Head:.                 Predefined Default
 | |
| "
 | |
| "   .. ...                  Pattern Repeat
 | |
| 
 | |
| syntax match mmaPatternError "\%(_\{4,}\|)\s*&\s*)\@!\)" contained
 | |
| 
 | |
| "pattern name:
 | |
| syntax match mmaPattern "[A-Za-z0-9`]\+\s*:\+[=>]\@!" contains=mmaOperator
 | |
| "pattern default:
 | |
| syntax match mmaPattern ": *[^ ,]\+[\], ]\@=" contains=@mmaCommentStrings,@mmaTop,mmaOperator
 | |
| "pattern head/test:
 | |
| syntax match mmaPattern "[A-Za-z0-9`]*_\+\%(\a\+\)\=\%(?([^)]\+)\|?[^\]},]\+\)\=" contains=@mmaTop,@mmaCommentStrings,mmaPatternError
 | |
| 
 | |
| " Operators:
 | |
| "   /: ^= ^:=   UpValue
 | |
| "   /;          Conditional
 | |
| "   := =        DownValue
 | |
| "   == === ||
 | |
| "   != =!= &&   Logic
 | |
| "   >= <= < >
 | |
| "   += -= *=
 | |
| "   /= ++ --    Math
 | |
| "   ^*
 | |
| "   -> :>       Rules
 | |
| "   @@ @@@      Apply
 | |
| "   /@ //@      Map
 | |
| "   /. //.      Replace
 | |
| "   // @        Function application
 | |
| "   <> ~~       String/Pattern join
 | |
| "   ~           infix operator
 | |
| "   . :         Pattern operators
 | |
| syntax match mmaOperator "\%(@\{1,3}\|//[.@]\=\)"
 | |
| syntax match mmaOperator "\%(/[;:@.]\=\|\^\=:\==\)"
 | |
| syntax match mmaOperator "\%([-:=]\=>\|<=\=\)"
 | |
| "syntax match mmaOperator "\%(++\=\|--\=\|[/+-*]=\|[^*]\)"
 | |
| syntax match mmaOperator "[*+=^.:?-]"
 | |
| syntax match mmaOperator "\%(\~\~\=\)"
 | |
| syntax match mmaOperator "\%(=\{2,3}\|=\=!=\|||\=\|&&\|!\)" contains=ALLBUT,mmaPureFunction
 | |
| 
 | |
| " Symbol Tags:
 | |
| "   "SymbolName::item"
 | |
| "syntax match mmaSymbol "`\=[a-zA-Z$]\+[0-9a-zA-Z$]*\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*" contained
 | |
| syntax match mmaMessage "`\=\([a-zA-Z$]\+[0-9a-zA-Z$]*\)\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*::\a\+" contains=mmaMessageType
 | |
| syntax match mmaMessageType "::\a\+"hs=s+2 contained
 | |
| 
 | |
| " Pure Functions:
 | |
| syntax match mmaPureFunction "#\%(#\|\d\+\)\="
 | |
| syntax match mmaPureFunction "&"
 | |
| 
 | |
| " Named Functions:
 | |
| " Since everything is pretty much a function, get this straight
 | |
| " from context
 | |
| syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator
 | |
| syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring
 | |
| syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator
 | |
| 
 | |
| " Numbers:
 | |
| syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>"
 | |
| syntax match mmaNumber "`\d\+\%(\d\@!\.\|\>\)"
 | |
| 
 | |
| " Special Characters:
 | |
| "   \[Name]     named character
 | |
| "   \ooo        octal
 | |
| "   \.xx        2 digit hex
 | |
| "   \:xxxx      4 digit hex (multibyte unicode)
 | |
| syntax match mmaUnicode "\\\[\w\+\d*\]"
 | |
| syntax match mmaUnicode "\\\%(\x\{3}\|\.\x\{2}\|:\x\{4}\)"
 | |
| 
 | |
| " Syntax Errors:
 | |
| syntax match mmaError "\*)" containedin=ALLBUT,@mmaComments,@mmaStrings
 | |
| syntax match mmaError "\%([/]{3,}\|[&:|+*?~-]\{3,}\|[.=]\{4,}\|_\@<=\.\{2,}\|`\{2,}\)" containedin=ALLBUT,@mmaComments,@mmaStrings
 | |
| 
 | |
| " Punctuation:
 | |
| " things that shouldn't really be highlighted, or highlighted
 | |
| " in they're own group if you _really_ want. :)
 | |
| "  ( ) { }
 | |
| " TODO - use Delimiter group?
 | |
| syntax match mmaBoring "[(){}]" contained
 | |
| 
 | |
| " ------------------------------------
 | |
| "    future explorations...
 | |
| " ------------------------------------
 | |
| " Function Arguments:
 | |
| "   anything between brackets []
 | |
| "   (fold)
 | |
| "syntax region mmaArgument start="\[" end="\]" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
 | |
| 
 | |
| " Lists:
 | |
| "   (fold)
 | |
| "syntax region mmaLists start="{" end="}" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
 | |
| 
 | |
| " Regions:
 | |
| "   (fold)
 | |
| "syntax region mmaRegion start="(\*\+[^<]*<!--[^>]*\*\+)" end="--> \*)" containedin=ALLBUT,@mmaStrings transparent fold keepend
 | |
| 
 | |
| " show fold text
 | |
| set commentstring='(*%s*)'
 | |
| "set foldtext=MmaFoldText()
 | |
| 
 | |
| "function MmaFoldText()
 | |
| "    let line = getline(v:foldstart)
 | |
| "
 | |
| "    let lines = v:foldend-v:foldstart+1
 | |
| "
 | |
| "    let sub = substitute(line, '(\*\+|\*\+)|[-*_]\+', '', 'g')
 | |
| "
 | |
| "    if match(line, '(\*') != -1
 | |
| "        let lines = lines.' line comment'
 | |
| "    else
 | |
| "        let lines = lines.' lines'
 | |
| "    endif
 | |
| "
 | |
| "    return v:folddashes.' '.lines.' '.sub
 | |
| "endf
 | |
| 
 | |
| "this is slow for computing folds, but it does so accurately
 | |
| syntax sync fromstart
 | |
| 
 | |
| " but this seems to do alright for non fold syntax coloring.
 | |
| " for folding, however, it doesn't get the nesting right.
 | |
| " TODO - find sync group for multiline modules? ick...
 | |
| 
 | |
| " sync multi line comments
 | |
| "syntax sync match syncComments groupthere NONE "\*)"
 | |
| "syntax sync match syncComments groupthere mmaComment "(\*"
 | |
| 
 | |
| "set foldmethod=syntax
 | |
| "set foldnestmax=1
 | |
| "set foldminlines=15
 | |
| 
 | |
| 
 | |
| " NOTE - the following links are not guaranteed to
 | |
| " look good under all colorschemes.  You might need to
 | |
| " :so $VIMRUNTIME/syntax/hitest.vim and tweak these to
 | |
| " look good in yours
 | |
| 
 | |
| 
 | |
| hi def link mmaComment           Comment
 | |
| hi def link mmaCommentStar       Comment
 | |
| hi def link mmaFunctionComment   Comment
 | |
| hi def link mmaLooseQuote        Comment
 | |
| hi def link mmaGenericFunction   Function
 | |
| hi def link mmaVariable          Identifier
 | |
| "    hi def link mmaSymbol            Identifier
 | |
| hi def link mmaOperator          Operator
 | |
| hi def link mmaPatternOp         Operator
 | |
| hi def link mmaPureFunction      Operator
 | |
| hi def link mmaString            String
 | |
| hi def link mmaCommentString     String
 | |
| hi def link mmaUnicode           String
 | |
| hi def link mmaMessage           Type
 | |
| hi def link mmaNumber            Type
 | |
| hi def link mmaPattern           Type
 | |
| hi def link mmaError             Error
 | |
| hi def link mmaFixme             Error
 | |
| hi def link mmaPatternError      Error
 | |
| hi def link mmaTodo              Todo
 | |
| hi def link mmaemPHAsis          Special
 | |
| hi def link mmaFunctionTitle     Special
 | |
| hi def link mmaMessageType       Special
 | |
| hi def link mmaItem              Preproc
 | |
| 
 | |
| 
 | |
| let b:current_syntax = "mma"
 | |
| 
 | |
| let &cpo = s:cpo_save
 | |
| unlet s:cpo_save
 |