blob: e2a6d1039c0910094657ce207de0d809680329e8 [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 Moolenaarcbaff5e2022-04-08 17:45:08 +01006" Last Change: 2022 Apr 06
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()
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +010018
19let b:undo_indent = "setl inde< indk<"
20
Bram Moolenaar071d4272004-06-13 20:20:40 +000021if exists("*DylanGetIndent")
22 finish
23endif
24
25function DylanGetIndent()
26 " Get the line to be indented
27 let cline = getline(v:lnum)
28
29 " Don't reindent comments on first column
30 if cline =~ '^/\[/\*]'
31 return 0
32 endif
33
34 "Find the previous non-blank line
35 let lnum = prevnonblank(v:lnum - 1)
36 "Use zero indent at the top of the file
37 if lnum == 0
38 return 0
39 endif
40
41 let prevline=getline(lnum)
42 let ind = indent(lnum)
43 let chg = 0
44
45 " If previous line was a comment, use its indent
46 if prevline =~ '^\s*//'
47 return ind
48 endif
49
50 " If previous line was a 'define', indent
51 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 +020052 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000053 " local methods indent the shift-width, plus 6 for the 'local'
54 elseif prevline =~? '^\s*local'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020055 let chg = shiftwidth() + 6
Bram Moolenaar071d4272004-06-13 20:20:40 +000056 " If previous line was a let with no closing semicolon, indent
57 elseif prevline =~? '^\s*let.*[^;]\s*$'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020058 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000059 " If previous line opened a parenthesis, and did not close it, indent
60 elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
61 return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
62 "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
63 elseif prevline =~ '^[^(]*)\s*$'
64 " This line closes a parenthesis. Find opening
65 let curr_line = prevnonblank(lnum - 1)
66 while curr_line >= 0
67 let str = getline(curr_line)
68 if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
69 let curr_line = prevnonblank(curr_line - 1)
70 else
71 break
72 endif
73 endwhile
74 if curr_line < 0
75 return -1
76 endif
77 let ind = indent(curr_line)
78 " Although we found the closing parenthesis, make sure this
79 " line doesn't start with an indentable command:
80 let curr_str = getline(curr_line)
81 if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020082 let chg = shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000083 endif
84 endif
85
86 " If a line starts with end, un-indent (even if we just indented!)
87 if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020088 let chg = chg - shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000089 endif
90
91 return ind + chg
92endfunction
93
94" vim:sw=2 tw=130