diff runtime/indent/mma.vim @ 271:8d34af900bae v7.0072

updated for version 7.0072
author vimboss
date Wed, 18 May 2005 22:24:46 +0000
parents
children 8cd729851562
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/runtime/indent/mma.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language:     Mathematica
+" Author:       steve layland <layland@wolfram.com>
+" Last Change:  Sat May  10 18:56:22 CDT 2005
+" Source:       http://vim.sourceforge.net/scripts/script.php?script_id=1274
+"               http://members.wolfram.com/layland/vim/indent/mma.vim
+"
+" NOTE:
+" Empty .m files will automatically be presumed to be Matlab files
+" unless you have the following in your .vimrc:
+"
+"       let filetype_m="mma"
+"
+" Credits:
+" o steve hacked this out of a random indent file in the Vim 6.1 
+"   distribution that he no longer remembers...sh.vim?  Thanks!
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+    finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMmaIndent()
+setlocal indentkeys+=0[,0],0(,0)
+setlocal nosi "turn off smart indent so we don't over analyze } blocks
+
+if exists("*GetMmaIndent")
+    finish
+endif
+
+function GetMmaIndent()
+   
+    " Hit the start of the file, use zero indent.
+    if v:lnum == 0
+        return 0
+    endif
+
+     " Find a non-blank line above the current line.
+    let lnum = prevnonblank(v:lnum - 1)
+   
+    " use indenting as a base 
+    let ind = indent(v:lnum)
+    let lnum = v:lnum
+    
+    " if previous line has an unmatched bracket, or ( indent.
+    " doesn't do multiple parens/blocks/etc...
+    
+    " also, indent only if this line if this line isn't starting a new
+    " block... TODO - fix this with indentkeys?
+    if getline(v:lnum-1) =~ '\\\@<!\%(\[[^\]]*\|([^)]*\|{[^}]*\)$' && getline(v:lnum) !~ '\s\+[\[({]'
+        let ind = ind+&sw
+    endif
+
+    " if this line had unmatched closing block, 
+    " indent to the matching opening block
+    if getline(v:lnum) =~ '[^[]*]\s*$'
+        " move to the closing bracket
+        call search(']','bW')
+        " and find it's partner's indent
+        let ind = indent(searchpair('\[','',']','bWn'))
+    " same for ( blocks
+    elseif getline(v:lnum) =~ '[^(]*)$'
+        call search(')','bW')
+        let ind = indent(searchpair('(','',')','bWn'))
+
+    " and finally, close { blocks if si ain't already set
+    elseif getline(v:lnum) =~ '[^{]*}'
+        call search('}','bW')
+        let ind = indent(searchpair('{','','}','bWn'))
+    endif
+
+    return ind
+endfunction
+