blob: 0afcbeada7352591ed53b1b7b90fb85e0260667e [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
2" Language: Dylan
3" Version: 0.01
4" Last Change: 2003 Feb 04
5" Maintainer: Brent A. Fulgham <bfulgham@debian.org>
6
7" Only load this indent file when no other was loaded.
8if exists("b:did_indent")
9 finish
10endif
11let b:did_indent = 1
12
13setlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while
14
15" Define the appropriate indent function but only once
16setlocal indentexpr=DylanGetIndent()
17if exists("*DylanGetIndent")
18 finish
19endif
20
21function DylanGetIndent()
22 " Get the line to be indented
23 let cline = getline(v:lnum)
24
25 " Don't reindent comments on first column
26 if cline =~ '^/\[/\*]'
27 return 0
28 endif
29
30 "Find the previous non-blank line
31 let lnum = prevnonblank(v:lnum - 1)
32 "Use zero indent at the top of the file
33 if lnum == 0
34 return 0
35 endif
36
37 let prevline=getline(lnum)
38 let ind = indent(lnum)
39 let chg = 0
40
41 " If previous line was a comment, use its indent
42 if prevline =~ '^\s*//'
43 return ind
44 endif
45
46 " If previous line was a 'define', indent
47 if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)'
48 let chg = &sw
49 " local methods indent the shift-width, plus 6 for the 'local'
50 elseif prevline =~? '^\s*local'
51 let chg = &sw + 6
52 " If previous line was a let with no closing semicolon, indent
53 elseif prevline =~? '^\s*let.*[^;]\s*$'
54 let chg = &sw
55 " If previous line opened a parenthesis, and did not close it, indent
56 elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
57 return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
58 "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
59 elseif prevline =~ '^[^(]*)\s*$'
60 " This line closes a parenthesis. Find opening
61 let curr_line = prevnonblank(lnum - 1)
62 while curr_line >= 0
63 let str = getline(curr_line)
64 if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
65 let curr_line = prevnonblank(curr_line - 1)
66 else
67 break
68 endif
69 endwhile
70 if curr_line < 0
71 return -1
72 endif
73 let ind = indent(curr_line)
74 " Although we found the closing parenthesis, make sure this
75 " line doesn't start with an indentable command:
76 let curr_str = getline(curr_line)
77 if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)'
78 let chg = &sw
79 endif
80 endif
81
82 " If a line starts with end, un-indent (even if we just indented!)
83 if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)'
84 let chg = chg - &sw
85 endif
86
87 return ind + chg
88endfunction
89
90" vim:sw=2 tw=130