blob: 933eb6130d4d1ae8b5d40ffcfd06a792543f9565 [file] [log] [blame]
Bram Moolenaar4a748032010-09-30 21:47:56 +02001" Vim indent file
2" Language: Falcon
3" Maintainer: Steven Oliver <oliver.steven@gmail.com>
4" Website: https://steveno@github.com/steveno/falconpl-vim.git
5" Credits: Thanks to the ruby.vim authors, I borrow a lot!
6" Previous Maintainer: Brent A. Fulgham <bfulgham@debian.org>
7" -----------------------------------------------------------
8" GetLatestVimScripts: 2752 1 :AutoInstall: falcon.vim
9
10"======================================
11" SETUP
12"======================================
13
14" Only load this indent file when no other was loaded.
15if exists("b:did_indent")
16 finish
17endif
18let b:did_indent = 1
19
20setlocal nosmartindent
21
22" Setup indent function and when to use it
23setlocal indentexpr=FalconGetIndent()
24setlocal indentkeys=0{,0},0),0],!^F,o,O,e
25setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\"
26
27" Define the appropriate indent function but only once
28if exists("*FalconGetIndent")
29 finish
30endif
31
32let s:cpo_save = &cpo
33set cpo&vim
34
35"======================================
36" VARIABLES
37"======================================
38
39" Regex of syntax group names that are strings AND comments
40let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>'
41
42" Regex of syntax group names that are strings
43let s:syng_string = '\<falcon\%(String\|StringEscape\)\>'
44
45" Keywords to indent on
46let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' .
47 \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' .
48 \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)'
49
50" Keywords to deindent on
51let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)'
52
53"======================================
54" FUNCTIONS
55"======================================
56
57" Check if the character at lnum:col is inside a string
58function s:IsInStringOrComment(lnum, col)
59 return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
60endfunction
61
62"======================================
63" INDENT ROUTINE
64"======================================
65
66function FalconGetIndent()
67 " Get the line to be indented
68 let cline = getline(v:lnum)
69
70 " Don't reindent comments on first column
71 if cline =~ '^\/\/'
72 return 0
73 endif
74
75 " Find the previous non-blank line
76 let lnum = prevnonblank(v:lnum - 1)
77
78 " Use zero indent at the top of the file
79 if lnum == 0
80 return 0
81 endif
82
83 let prevline=getline(lnum)
84 let ind = indent(lnum)
85 let chg = 0
86
87 " If we are in a multi-line string or line-comment, don't do anything
88 if s:IsInStringOrComment(v:lnum, matchend(cline, '^\s*') + 1 )
89 return indent('.')
90 endif
91
92 " If the start of the line equals a double quote, then indent to the
93 " previous lines first double quote
94 if cline =~? '^\s*"'
95 let chg = chg + &sw
96 endif
97
98 " If previous line started with a double quote and this one
99 " doesn't, unindent
100 if prevline =~? '^\s*"' && cline =~? '^\s*'
101 let chg = chg - &sw
102 endif
103
104 " Indent if proper keyword
105 if prevline =~? s:falcon_indent_keywords
106 let chg = &sw
107 " If previous line opened a parenthesis, and did not close it, indent
108 elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
109 " Make sure this isn't just a function split between two lines
110 if prevline =~ ',\s*$'
111 return indent(prevnonblank(v:lnum - 1)) + &sw
112 else
113 return match(prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
114 endif
115 elseif prevline =~ '^[^(]*)\s*$'
116 " This line closes a parenthesis. Finds opening.
117 let curr_line = prevnonblank(lnum - 1)
118 while curr_line >= 0
119 let str = getline(curr_line)
120 if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
121 let curr_line = prevnonblank(curr_line - 1)
122 else
123 break
124 endif
125 endwhile
126 if curr_line < 0
127 return -1
128 endif
129 let ind = indent(curr_line)
130 endif
131
132 " If previous line ends in a semi-colon reset indent to previous
133 " lines setting
134 if prevline =~? ';\s*$' && prevnonblank(prevline) =~? ',\s*$'
135 return chg = chg - (2 * &sw)
136 endif
137
138 " If previous line ended in a comma, indent again
139 if prevline =~? ',\s*$'
140 let chg = chg + &sw
141 endif
142
143 " If previous line ended in a =>, indent again
144 if prevline =~? '=>\s*$'
145 let chg = chg + &sw
146 endif
147
148 " Deindent on proper keywords
149 if cline =~? s:falcon_deindent_keywords
150 let chg = chg - &sw
151 endif
152
153 return ind + chg
154endfunction
155
156" vim: set sw=4 sts=4 et tw=80 :