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 using parens and control statements" do
104 it "avoids ambiguity by using extra indentation" do
105 vim.feedkeys 'iif (111 and\<CR>'
107 indent.should == shiftwidth * 2
111 vim.feedkeys '222):\<CR>'
112 indent.should == shiftwidth
113 vim.feedkeys 'pass\<CR>'
117 it "still aligns parens properly if not ambiguous" do
118 vim.feedkeys 'iwhile (111 and\<CR>'
120 vim.feedkeys '222):\<CR>'
121 indent.should == shiftwidth
122 vim.feedkeys 'pass\<CR>'
126 it "still handles multiple parens correctly" do
127 vim.feedkeys 'iif (111 and (222 and 333\<CR>'
129 vim.feedkeys 'and 444\<CR>'
131 vim.feedkeys ')\<CR>'
133 indent.should == shiftwidth * 2
137 vim.feedkeys 'and 555):\<CR>'
138 indent.should == shiftwidth
139 vim.feedkeys 'pass\<CR>'
144 describe "when a line breaks with a manual '\\'" do
145 it "indents shiftwidth spaces on normal line" do
146 vim.feedkeys 'ivalue = test + \\\\\<CR>'
147 indent.should == shiftwidth
150 it "indents 2x shiftwidth spaces for control structures" do
151 vim.feedkeys 'iif somevalue == xyz and \\\\\<CR>'
152 indent.should == shiftwidth * 2
155 it "indents relative to line above" do
156 vim.feedkeys 'i\<TAB>value = test + \\\\\<CR>'
157 indent.should == shiftwidth * 2
161 describe "when current line is dedented compared to previous line" do
162 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>return True\<CR>\<ESC>' }
163 it "and current line has a valid indentation (Part 1)" do
164 vim.feedkeys '0i\<TAB>if y:'
165 proposed_indent.should == -1
168 it "and current line has a valid indentation (Part 2)" do
169 vim.feedkeys '0i\<TAB>\<TAB>if y:'
170 proposed_indent.should == -1
173 it "and current line has an invalid indentation" do
174 vim.feedkeys 'i while True:\<CR>'
175 indent.should == previous_indent + shiftwidth
179 describe "when an 'if' is followed by" do
180 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>' }
181 it "an elif, it lines up with the 'if'" do
182 vim.feedkeys 'elif y:'
183 indent.should == shiftwidth * 2
186 it "an 'else', it lines up with the 'if'" do
188 indent.should == shiftwidth * 2
192 describe "when a 'for' is followed by" do
193 before { vim.feedkeys 'i\<TAB>\<TAB>for x in y:\<CR>' }
194 it "an 'else', it lines up with the 'for'" do
196 indent.should == shiftwidth * 2
200 describe "when an 'else' is followed by" do
201 before { vim.feedkeys 'i\<TAB>\<TAB>else:\<CR>XXX\<CR>' }
202 it "a 'finally', it lines up with the 'else'" do
203 vim.feedkeys 'finally:'
204 indent.should == shiftwidth * 2
209 describe "when a 'try' is followed by" do
210 before { vim.feedkeys 'i\<TAB>\<TAB>try:\<CR>' }
211 it "an 'except', it lines up with the 'try'" do
212 vim.feedkeys 'except:'
213 indent.should == shiftwidth * 2
216 it "an 'else', it lines up with the 'try'" do
218 indent.should == shiftwidth * 2
221 it "a 'finally', it lines up with the 'try'" do
222 vim.feedkeys 'finally:'
223 indent.should == shiftwidth * 2
227 describe "when an 'except' is followed by" do
228 before { vim.feedkeys 'i\<TAB>\<TAB>except:\<CR>' }
229 it "an 'else', it lines up with the 'except'" do
231 indent.should == shiftwidth * 2
234 it "another 'except', it lines up with the previous 'except'" do
235 vim.feedkeys 'except:'
236 indent.should == shiftwidth * 2
239 it "a 'finally', it lines up with the 'except'" do
240 vim.feedkeys 'finally:'
241 indent.should == shiftwidth * 2
246 @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i
249 @tabstop ||= vim.echo("&tabstop").to_i
252 vim.echo("indent('.')").to_i
255 pline = vim.echo("line('.')").to_i - 1
256 vim.echo("indent('#{pline}')").to_i
259 line = vim.echo("line('.')")
260 col = vim.echo("col('.')")
261 indent_value = vim.echo("GetPythonPEPIndent(line('.'))").to_i
262 vim.command("call cursor(#{line}, #{col})")
267 describe "vim when using width of 4" do
269 vim.command("set sw=4 ts=4 sts=4 et")
272 it_behaves_like "vim"
275 describe "vim when using width of 8" do
277 vim.command("set sw=8 ts=8 sts=8 et")
280 it_behaves_like "vim"