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