blob: 6811ec4af5584388f3d7ae656319574860d19c70 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
2" Language: Dylan
3" Version: 0.01
Bram Moolenaar3ec574f2017-06-13 18:12:01 +02004" Last Change: 2017 Jun 13
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" 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*=>$\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020048 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 " local methods indent the shift-width, plus 6 for the 'local'
50 elseif prevline =~? '^\s*local'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020051 let chg = shiftwidth() + 6
Bram Moolenaar071d4272004-06-13 20:20:40 +000052 " If previous line was a let with no closing semicolon, indent
53 elseif prevline =~? '^\s*let.*[^;]\s*$'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020054 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000055 " 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\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020078 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000079 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\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020084 let chg = chg - shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000085 endif
86
87 return ind + chg
88endfunction
89
90" vim:sw=2 tw=130