xref: /vim-8.2.3635/runtime/indent/mma.vim (revision 2bf24176)
1" Vim indent file
2" Language:     Mathematica
3" Author:       steve layland <[email protected]>
4" Last Change:  Sat May  10 18:56:22 CDT 2005
5" Source:       http://vim.sourceforge.net/scripts/script.php?script_id=1274
6"               http://members.wolfram.com/layland/vim/indent/mma.vim
7"
8" NOTE:
9" Empty .m files will automatically be presumed to be Matlab files
10" unless you have the following in your .vimrc:
11"
12"       let filetype_m="mma"
13"
14" Credits:
15" o steve hacked this out of a random indent file in the Vim 6.1
16"   distribution that he no longer remembers...sh.vim?  Thanks!
17
18" Only load this indent file when no other was loaded.
19if exists("b:did_indent")
20    finish
21endif
22let b:did_indent = 1
23
24setlocal indentexpr=GetMmaIndent()
25setlocal indentkeys+=0[,0],0(,0)
26setlocal nosi "turn off smart indent so we don't over analyze } blocks
27
28if exists("*GetMmaIndent")
29    finish
30endif
31
32function GetMmaIndent()
33
34    " Hit the start of the file, use zero indent.
35    if v:lnum == 0
36        return 0
37    endif
38
39     " Find a non-blank line above the current line.
40    let lnum = prevnonblank(v:lnum - 1)
41
42    " use indenting as a base
43    let ind = indent(v:lnum)
44    let lnum = v:lnum
45
46    " if previous line has an unmatched bracket, or ( indent.
47    " doesn't do multiple parens/blocks/etc...
48
49    " also, indent only if this line if this line isn't starting a new
50    " block... TODO - fix this with indentkeys?
51    if getline(v:lnum-1) =~ '\\\@<!\%(\[[^\]]*\|([^)]*\|{[^}]*\)$' && getline(v:lnum) !~ '\s\+[\[({]'
52        let ind = ind+&sw
53    endif
54
55    " if this line had unmatched closing block,
56    " indent to the matching opening block
57    if getline(v:lnum) =~ '[^[]*]\s*$'
58        " move to the closing bracket
59        call search(']','bW')
60        " and find it's partner's indent
61        let ind = indent(searchpair('\[','',']','bWn'))
62    " same for ( blocks
63    elseif getline(v:lnum) =~ '[^(]*)$'
64        call search(')','bW')
65        let ind = indent(searchpair('(','',')','bWn'))
66
67    " and finally, close { blocks if si ain't already set
68    elseif getline(v:lnum) =~ '[^{]*}'
69        call search('}','bW')
70        let ind = indent(searchpair('{','','}','bWn'))
71    endif
72
73    return ind
74endfunction
75
76