mirror of
				https://github.com/vim/vim.git
				synced 2025-11-03 09:44:48 -05: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
 |