xref: /vim-8.2.3635/runtime/indent/dylan.vim (revision 6e649224)
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