1" 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 91