1071d4279SBram Moolenaar" Vim indent file 2071d4279SBram Moolenaar" Language: Dylan 3*6e649224SBram Moolenaar" Maintainer: Brent A. Fulgham <[email protected]> (Invalid email address) 4*6e649224SBram Moolenaar" Doug Kearns <[email protected]> 5071d4279SBram Moolenaar" Version: 0.01 63ec574f2SBram Moolenaar" Last Change: 2017 Jun 13 7071d4279SBram Moolenaar 8071d4279SBram Moolenaar" Only load this indent file when no other was loaded. 9071d4279SBram Moolenaarif exists("b:did_indent") 10071d4279SBram Moolenaar finish 11071d4279SBram Moolenaarendif 12071d4279SBram Moolenaarlet b:did_indent = 1 13071d4279SBram Moolenaar 14071d4279SBram Moolenaarsetlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while 15071d4279SBram Moolenaar 16071d4279SBram Moolenaar" Define the appropriate indent function but only once 17071d4279SBram Moolenaarsetlocal indentexpr=DylanGetIndent() 18071d4279SBram Moolenaarif exists("*DylanGetIndent") 19071d4279SBram Moolenaar finish 20071d4279SBram Moolenaarendif 21071d4279SBram Moolenaar 22071d4279SBram Moolenaarfunction DylanGetIndent() 23071d4279SBram Moolenaar " Get the line to be indented 24071d4279SBram Moolenaar let cline = getline(v:lnum) 25071d4279SBram Moolenaar 26071d4279SBram Moolenaar " Don't reindent comments on first column 27071d4279SBram Moolenaar if cline =~ '^/\[/\*]' 28071d4279SBram Moolenaar return 0 29071d4279SBram Moolenaar endif 30071d4279SBram Moolenaar 31071d4279SBram Moolenaar "Find the previous non-blank line 32071d4279SBram Moolenaar let lnum = prevnonblank(v:lnum - 1) 33071d4279SBram Moolenaar "Use zero indent at the top of the file 34071d4279SBram Moolenaar if lnum == 0 35071d4279SBram Moolenaar return 0 36071d4279SBram Moolenaar endif 37071d4279SBram Moolenaar 38071d4279SBram Moolenaar let prevline=getline(lnum) 39071d4279SBram Moolenaar let ind = indent(lnum) 40071d4279SBram Moolenaar let chg = 0 41071d4279SBram Moolenaar 42071d4279SBram Moolenaar " If previous line was a comment, use its indent 43071d4279SBram Moolenaar if prevline =~ '^\s*//' 44071d4279SBram Moolenaar return ind 45071d4279SBram Moolenaar endif 46071d4279SBram Moolenaar 47071d4279SBram Moolenaar " If previous line was a 'define', indent 48071d4279SBram Moolenaar if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)' 493ec574f2SBram Moolenaar let chg = shiftwidth() 50071d4279SBram Moolenaar " local methods indent the shift-width, plus 6 for the 'local' 51071d4279SBram Moolenaar elseif prevline =~? '^\s*local' 523ec574f2SBram Moolenaar let chg = shiftwidth() + 6 53071d4279SBram Moolenaar " If previous line was a let with no closing semicolon, indent 54071d4279SBram Moolenaar elseif prevline =~? '^\s*let.*[^;]\s*$' 553ec574f2SBram Moolenaar let chg = shiftwidth() 56071d4279SBram Moolenaar " If previous line opened a parenthesis, and did not close it, indent 57071d4279SBram Moolenaar elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' 58071d4279SBram Moolenaar return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1 59071d4279SBram Moolenaar "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' 60071d4279SBram Moolenaar elseif prevline =~ '^[^(]*)\s*$' 61071d4279SBram Moolenaar " This line closes a parenthesis. Find opening 62071d4279SBram Moolenaar let curr_line = prevnonblank(lnum - 1) 63071d4279SBram Moolenaar while curr_line >= 0 64071d4279SBram Moolenaar let str = getline(curr_line) 65071d4279SBram Moolenaar if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' 66071d4279SBram Moolenaar let curr_line = prevnonblank(curr_line - 1) 67071d4279SBram Moolenaar else 68071d4279SBram Moolenaar break 69071d4279SBram Moolenaar endif 70071d4279SBram Moolenaar endwhile 71071d4279SBram Moolenaar if curr_line < 0 72071d4279SBram Moolenaar return -1 73071d4279SBram Moolenaar endif 74071d4279SBram Moolenaar let ind = indent(curr_line) 75071d4279SBram Moolenaar " Although we found the closing parenthesis, make sure this 76071d4279SBram Moolenaar " line doesn't start with an indentable command: 77071d4279SBram Moolenaar let curr_str = getline(curr_line) 78071d4279SBram Moolenaar if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)' 793ec574f2SBram Moolenaar let chg = shiftwidth() 80071d4279SBram Moolenaar endif 81071d4279SBram Moolenaar endif 82071d4279SBram Moolenaar 83071d4279SBram Moolenaar " If a line starts with end, un-indent (even if we just indented!) 84071d4279SBram Moolenaar if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)' 853ec574f2SBram Moolenaar let chg = chg - shiftwidth() 86071d4279SBram Moolenaar endif 87071d4279SBram Moolenaar 88071d4279SBram Moolenaar return ind + chg 89071d4279SBram Moolenaarendfunction 90071d4279SBram Moolenaar 91071d4279SBram Moolenaar" vim:sw=2 tw=130 92