2014-07-10 21:05:51 -07:00
|
|
|
" Vim indent file
|
|
|
|
" Language: Dylan
|
2021-10-05 05:12:16 -07:00
|
|
|
" Maintainer: Brent A. Fulgham <bfulgham@debian.org> (Invalid email address)
|
|
|
|
" Doug Kearns <dougkearns@gmail.com>
|
2014-07-10 21:05:51 -07:00
|
|
|
" Version: 0.01
|
2022-04-08 10:53:41 -07:00
|
|
|
" Last Change: 2022 Apr 06
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
" Only load this indent file when no other was loaded.
|
|
|
|
if exists("b:did_indent")
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
let b:did_indent = 1
|
|
|
|
|
|
|
|
setlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while
|
|
|
|
|
|
|
|
" Define the appropriate indent function but only once
|
|
|
|
setlocal indentexpr=DylanGetIndent()
|
2022-04-08 10:53:41 -07:00
|
|
|
|
|
|
|
let b:undo_indent = "setl inde< indk<"
|
|
|
|
|
2014-07-10 21:05:51 -07:00
|
|
|
if exists("*DylanGetIndent")
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
|
|
|
|
function DylanGetIndent()
|
|
|
|
" Get the line to be indented
|
|
|
|
let cline = getline(v:lnum)
|
|
|
|
|
|
|
|
" Don't reindent comments on first column
|
|
|
|
if cline =~ '^/\[/\*]'
|
|
|
|
return 0
|
|
|
|
endif
|
|
|
|
|
|
|
|
"Find the previous non-blank line
|
|
|
|
let lnum = prevnonblank(v:lnum - 1)
|
|
|
|
"Use zero indent at the top of the file
|
|
|
|
if lnum == 0
|
|
|
|
return 0
|
|
|
|
endif
|
|
|
|
|
|
|
|
let prevline=getline(lnum)
|
|
|
|
let ind = indent(lnum)
|
|
|
|
let chg = 0
|
|
|
|
|
|
|
|
" If previous line was a comment, use its indent
|
|
|
|
if prevline =~ '^\s*//'
|
|
|
|
return ind
|
|
|
|
endif
|
|
|
|
|
|
|
|
" If previous line was a 'define', indent
|
|
|
|
if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)'
|
2017-11-06 17:34:28 -07:00
|
|
|
let chg = shiftwidth()
|
2014-07-10 21:05:51 -07:00
|
|
|
" local methods indent the shift-width, plus 6 for the 'local'
|
|
|
|
elseif prevline =~? '^\s*local'
|
2017-11-06 17:34:28 -07:00
|
|
|
let chg = shiftwidth() + 6
|
2014-07-10 21:05:51 -07:00
|
|
|
" If previous line was a let with no closing semicolon, indent
|
|
|
|
elseif prevline =~? '^\s*let.*[^;]\s*$'
|
2017-11-06 17:34:28 -07:00
|
|
|
let chg = shiftwidth()
|
2014-07-10 21:05:51 -07:00
|
|
|
" If previous line opened a parenthesis, and did not close it, indent
|
|
|
|
elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
|
|
|
|
return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
|
|
|
|
"elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
|
|
|
|
elseif prevline =~ '^[^(]*)\s*$'
|
|
|
|
" This line closes a parenthesis. Find opening
|
|
|
|
let curr_line = prevnonblank(lnum - 1)
|
|
|
|
while curr_line >= 0
|
|
|
|
let str = getline(curr_line)
|
|
|
|
if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
|
|
|
|
let curr_line = prevnonblank(curr_line - 1)
|
|
|
|
else
|
|
|
|
break
|
|
|
|
endif
|
|
|
|
endwhile
|
|
|
|
if curr_line < 0
|
|
|
|
return -1
|
|
|
|
endif
|
|
|
|
let ind = indent(curr_line)
|
|
|
|
" Although we found the closing parenthesis, make sure this
|
|
|
|
" line doesn't start with an indentable command:
|
|
|
|
let curr_str = getline(curr_line)
|
|
|
|
if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)'
|
2017-11-06 17:34:28 -07:00
|
|
|
let chg = shiftwidth()
|
2014-07-10 21:05:51 -07:00
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
" If a line starts with end, un-indent (even if we just indented!)
|
|
|
|
if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)'
|
2017-11-06 17:34:28 -07:00
|
|
|
let chg = chg - shiftwidth()
|
2014-07-10 21:05:51 -07:00
|
|
|
endif
|
|
|
|
|
|
|
|
return ind + chg
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
" vim:sw=2 tw=130
|