All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
3 shared_examples_for "vim" do
5 before(:each) { vim.normal 'gg"_dG' } # clear buffer
7 describe "when using the indent plugin" do
8 it "sets the indentexpr and indentkeys options" do
9 vim.command("set indentexpr?").should include "GetPythonPEPIndent("
10 vim.command("set indentkeys?").should include "=elif"
13 it "sets autoindent and expandtab" do
14 vim.command("set autoindent?").should match(/\s*autoindent/)
15 vim.command("set expandtab?").should match(/\s*expandtab/)
19 describe "when entering the first line" do
20 before { vim.feedkeys 'ipass' }
22 it "does not indent" do
23 proposed_indent.should == 0
27 it "does not indent when using '=='" do
33 describe "when after a '(' that is at the end of its line" do
34 before { vim.feedkeys 'itest(\<CR>' }
36 it "indents by one level" do
37 proposed_indent.should == shiftwidth
38 vim.feedkeys 'something'
39 indent.should == shiftwidth
41 indent.should == shiftwidth
44 it "puts the closing parenthesis at the same level" do
50 describe "when after an '(' that is followed by something" do
51 before { vim.feedkeys 'itest(something,\<CR>' }
53 it "lines up on following lines" do
55 vim.feedkeys 'more,\<CR>'
59 it "lines up the closing parenthesis" do
64 it "does not touch the closing parenthesis if it is already indented further" do
70 describe "when after multiple parens of different types" do
71 it "indents by one level" do
72 vim.feedkeys 'if({\<CR>'
73 indent.should == shiftwidth
76 it "lines up with the last paren" do
77 vim.feedkeys 'ifff({123: 456,\<CR>'
82 describe "when '#' is contained in a string that is followed by a colon" do
83 it "indents by one level" do
84 vim.feedkeys 'iif "some#thing" == "test":#test\<CR>pass'
85 indent.should == shiftwidth
89 describe "when '#' is not contained in a string and is followed by a colon" do
90 it "does not indent" do
91 vim.feedkeys 'iif "some#thing" == "test"#:test\<CR>'
96 describe "when using simple control structures" do
97 it "indents shiftwidth spaces" do
98 vim.feedkeys 'iwhile True:\<CR>pass'
99 indent.should == shiftwidth
103 describe "when writing an 'else' block" do
104 it "aligns to the preceeding 'for' block" do
105 vim.feedkeys 'ifor x in "abc":\<CR>pass\<CR>else:'
109 it "aligns to the preceeding 'if' block" do
110 vim.feedkeys 'ifor x in "abc":\<CR>if True:\<CR>pass\<CR>else:'
111 indent.should == shiftwidth
115 describe "when using parens and control statements" do
116 it "avoids ambiguity by using extra indentation" do
117 vim.feedkeys 'iif (111 and\<CR>'
119 indent.should == shiftwidth * 2
123 vim.feedkeys '222):\<CR>'
124 indent.should == shiftwidth
125 vim.feedkeys 'pass\<CR>'
129 it "still aligns parens properly if not ambiguous" do
130 vim.feedkeys 'iwhile (111 and\<CR>'
132 vim.feedkeys '222):\<CR>'
133 indent.should == shiftwidth
134 vim.feedkeys 'pass\<CR>'
138 it "still handles multiple parens correctly" do
139 vim.feedkeys 'iif (111 and (222 and 333\<CR>'
141 vim.feedkeys 'and 444\<CR>'
143 vim.feedkeys ')\<CR>'
145 indent.should == shiftwidth * 2
149 vim.feedkeys 'and 555):\<CR>'
150 indent.should == shiftwidth
151 vim.feedkeys 'pass\<CR>'
156 describe "when a line breaks with a manual '\\'" do
157 it "indents shiftwidth spaces on normal line" do
158 vim.feedkeys 'ivalue = test + \\\\\<CR>'
159 indent.should == shiftwidth
162 it "indents 2x shiftwidth spaces for control structures" do
163 vim.feedkeys 'iif somevalue == xyz and \\\\\<CR>'
164 indent.should == shiftwidth * 2
167 it "indents relative to line above" do
168 vim.feedkeys 'i\<TAB>value = test + \\\\\<CR>'
169 indent.should == shiftwidth * 2
173 describe "when current line is dedented compared to previous line" do
174 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>return True\<CR>\<ESC>' }
175 it "and current line has a valid indentation (Part 1)" do
176 vim.feedkeys '0i\<TAB>if y:'
177 proposed_indent.should == -1
180 it "and current line has a valid indentation (Part 2)" do
181 vim.feedkeys '0i\<TAB>\<TAB>if y:'
182 proposed_indent.should == -1
185 it "and current line has an invalid indentation" do
186 vim.feedkeys 'i while True:\<CR>'
187 indent.should == previous_indent + shiftwidth
191 describe "when an 'if' is followed by" do
192 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>' }
193 it "an elif, it lines up with the 'if'" do
194 vim.feedkeys 'elif y:'
195 indent.should == shiftwidth * 2
198 it "an 'else', it lines up with the 'if'" do
200 indent.should == shiftwidth * 2
204 describe "when a 'for' is followed by" do
205 before { vim.feedkeys 'i\<TAB>\<TAB>for x in y:\<CR>' }
206 it "an 'else', it lines up with the 'for'" do
208 indent.should == shiftwidth * 2
212 describe "when an 'else' is followed by" do
213 before { vim.feedkeys 'i\<TAB>\<TAB>else:\<CR>XXX\<CR>' }
214 it "a 'finally', it lines up with the 'else'" do
215 vim.feedkeys 'finally:'
216 indent.should == shiftwidth * 2
221 describe "when a 'try' is followed by" do
222 before { vim.feedkeys 'i\<TAB>\<TAB>try:\<CR>' }
223 it "an 'except', it lines up with the 'try'" do
224 vim.feedkeys 'except:'
225 indent.should == shiftwidth * 2
228 it "an 'else', it lines up with the 'try'" do
230 indent.should == shiftwidth * 2
233 it "a 'finally', it lines up with the 'try'" do
234 vim.feedkeys 'finally:'
235 indent.should == shiftwidth * 2
239 describe "when an 'except' is followed by" do
240 before { vim.feedkeys 'i\<TAB>\<TAB>except:\<CR>' }
241 it "an 'else', it lines up with the 'except'" do
243 indent.should == shiftwidth * 2
246 it "another 'except', it lines up with the previous 'except'" do
247 vim.feedkeys 'except:'
248 indent.should == shiftwidth * 2
251 it "a 'finally', it lines up with the 'except'" do
252 vim.feedkeys 'finally:'
253 indent.should == shiftwidth * 2
258 @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i
261 @tabstop ||= vim.echo("&tabstop").to_i
264 vim.echo("indent('.')").to_i
267 pline = vim.echo("line('.')").to_i - 1
268 vim.echo("indent('#{pline}')").to_i
271 line = vim.echo("line('.')")
272 col = vim.echo("col('.')")
273 indent_value = vim.echo("GetPythonPEPIndent(line('.'))").to_i
274 vim.command("call cursor(#{line}, #{col})")
279 describe "vim when using width of 4" do
281 vim.command("set sw=4 ts=4 sts=4 et")
284 it_behaves_like "vim"
287 describe "vim when using width of 8" do
289 vim.command("set sw=8 ts=8 sts=8 et")
292 it_behaves_like "vim"