setlocal softtabstop=4
setlocal shiftwidth=4
+if !exists('g:python_pep8_indent_multiline_string')
+ let g:python_pep8_indent_multiline_string = 0
+endif
+
let s:maxoff = 50
let s:block_rules = {
\ '^\s*elif\>': ['if', 'elif'],
endfunction
function! GetPythonPEPIndent(lnum)
-
" First line has indent 0
if a:lnum == 1
return 0
endif
" Multilinestrings: continous, docstring or starting.
- if s:is_python_string(a:lnum)
+ if s:is_python_string(a:lnum, 1)
+ \ && s:is_python_string(a:lnum-1, len(getline(a:lnum-1)))
+ " Keep existing indent.
+ if match(getline(a:lnum), '\v^\s*\S') != -1
+ return -1
+ endif
+
if s:is_python_string(a:lnum-1)
" Previous line is (completely) a string.
- return s:indent_like_previous_line(a:lnum)
+ return indent(a:lnum-1)
endif
if match(getline(a:lnum-1), '^\s*\%("""\|''''''\)') != -1
" docstring.
- return s:indent_like_previous_line(a:lnum)
+ return indent(a:lnum-1)
endif
- if s:is_python_string(a:lnum-1, len(getline(a:lnum-1)))
- " String started in previous line.
- return 0
+ let indent_multi = get(b:, 'python_pep8_indent_multiline_string',
+ \ get(g:, 'python_pep8_indent_multiline_string', 0))
+ if indent_multi != -2
+ return indent_multi
+ endif
+
+ if match(getline(a:lnum-1), '\v%("""|'''''')$') != -1
+ " Opening multiline string, started in previous line.
+ return indent(a:lnum-1) + s:sw()
endif
+ return s:indent_like_opening_paren(a:lnum)
endif
" Parens: If we can find an open parenthesis/bracket/brace, line up with it.
before { vim.feedkeys '0ggipass' }
it "does not indent" do
- proposed_indent.should == 0
indent.should == 0
+ proposed_indent.should == 0
end
it "does not indent when using '=='" do
end
end
- describe "when after an '(' that is followed by an unfinished string" do
- before { vim.feedkeys 'itest("""' }
-
- it "it does not indent the next line" do
- vim.feedkeys '\<CR>'
- proposed_indent.should == 0
- indent.should == 0
- end
-
- it "with contents it does not indent the next line" do
- vim.feedkeys 'string_contents\<CR>'
- proposed_indent.should == 0
- indent.should == 0
- end
- end
-
- describe "when after assigning an unfinished string" do
- before { vim.feedkeys 'itest = """' }
-
- it "it does not indent the next line" do
- vim.feedkeys '\<CR>'
- proposed_indent.should == 0
- indent.should == 0
- end
- end
-
- describe "when after assigning an unfinished string" do
- before { vim.feedkeys 'i test = """' }
-
- it "it does not indent the next line" do
- vim.feedkeys '\<CR>'
- proposed_indent.should == 0
- indent.should == 0
- end
- end
-
- describe "when after assigning a finished string" do
- before { vim.feedkeys 'i test = ""' }
-
- it "it does indent the next line" do
- vim.feedkeys '\<CR>'
- proposed_indent.should == 4
- indent.should == 4
- end
-
- it "and writing a new string, it does indent the next line" do
- vim.feedkeys '\<CR>""'
- proposed_indent.should == 4
- indent.should == 4
- end
- end
-
- describe "when after a docstring" do
- before { vim.feedkeys 'i """' }
-
- it "it does indent the next line" do
- vim.feedkeys '\<CR>'
- proposed_indent.should == 4
- indent.should == 4
- end
- end
-
describe "when using simple control structures" do
it "indents shiftwidth spaces" do
vim.feedkeys 'iwhile True:\<CR>pass'
indent.should == shiftwidth * 2
end
end
+end
+
+shared_examples_for "multiline strings" do
+ describe "when after an '(' that is followed by an unfinished string" do
+ before { vim.feedkeys 'itest("""' }
- def shiftwidth
- @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i
+ it "it indents the next line" do
+ vim.feedkeys '\<CR>'
+ expected_proposed, expected_indent = multiline_indent(0, shiftwidth)
+ proposed_indent.should == expected_proposed
+ indent.should == expected_indent
+ end
+
+ it "with contents it indents the second line to the parenthesis" do
+ vim.feedkeys 'second line\<CR>'
+ expected_proposed, expected_indent = multiline_indent(0, 5)
+ proposed_indent.should == expected_proposed
+ indent.should == expected_indent
+ end
+ end
+
+ describe "when after assigning an unfinished string" do
+ before { vim.feedkeys 'itest = """' }
+
+ it "it indents the next line" do
+ vim.feedkeys '\<CR>'
+ expected_proposed, expected_indent = multiline_indent(0, shiftwidth)
+ proposed_indent.should == expected_proposed
+ indent.should == expected_indent
+ end
end
- def tabstop
- @tabstop ||= vim.echo("&tabstop").to_i
+
+ describe "when after assigning an unfinished string" do
+ before { vim.feedkeys 'i test = """' }
+
+ it "it indents the next line" do
+ vim.feedkeys '\<CR>'
+ expected_proposed, expected_indent = multiline_indent(4, shiftwidth + 4)
+ proposed_indent.should == expected_proposed
+ indent.should == expected_indent
+ end
end
- def indent
- vim.echo("indent('.')").to_i
+
+ describe "when after assigning a finished string" do
+ before { vim.feedkeys 'i test = ""' }
+
+ it "it does indent the next line" do
+ vim.feedkeys '\<CR>'
+ indent.should == 4
+ end
+
+ it "and writing a new string, it does indent the next line" do
+ vim.feedkeys '\<CR>""'
+ indent.should == 4
+ end
end
- def previous_indent
- pline = vim.echo("line('.')").to_i - 1
- vim.echo("indent('#{pline}')").to_i
+
+ describe "when after a docstring" do
+ before { vim.feedkeys 'i """' }
+ it "it does indent the next line to the docstring" do
+ vim.feedkeys '\<CR>'
+ indent.should == 4
+ proposed_indent.should == 4
+ end
end
- def proposed_indent
- line = vim.echo("line('.')")
- col = vim.echo("col('.')")
- indent_value = vim.echo("GetPythonPEPIndent(line('.'))").to_i
- vim.command("call cursor(#{line}, #{col})")
- return indent_value
+
+ describe "when after a docstring with contents" do
+ before { vim.feedkeys 'i """First line' }
+ it "it does indent the next line to the docstring" do
+ vim.feedkeys '\<CR>'
+ indent.should == 4
+ proposed_indent.should == 4
+ end
end
end
before {
vim.command("set sw=4 ts=4 sts=4 et")
}
+ it_behaves_like "vim"
+end
+describe "vim when using width of 3" do
+ before {
+ vim.command("set sw=3 ts=3 sts=3 et")
+ }
it_behaves_like "vim"
end
-describe "vim when using width of 8" do
+describe "vim when not using python_pep8_indent_multiline_string" do
before {
- vim.command("set sw=8 ts=8 sts=8 et")
+ vim.command("set sw=4 ts=4 sts=4 et")
+ vim.command("unlet! g:python_pep8_indent_multiline_string")
}
+ it_behaves_like "multiline strings"
+end
- it_behaves_like "vim"
+describe "vim when using python_pep8_indent_multiline_first=0" do
+ before {
+ vim.command("set sw=4 ts=4 sts=4 et")
+ vim.command("let g:python_pep8_indent_multiline_string=0")
+ }
+ it_behaves_like "multiline strings"
+end
+
+describe "vim when using python_pep8_indent_multiline_string=-1" do
+ before {
+ vim.command("set sw=4 ts=4 sts=4 et")
+ vim.command("let g:python_pep8_indent_multiline_string=-1")
+ }
+ it_behaves_like "multiline strings"
+end
+
+describe "vim when using python_pep8_indent_multiline_string=-2" do
+ before {
+ vim.command("set sw=4 ts=4 sts=4 et")
+ vim.command("let g:python_pep8_indent_multiline_string=-2")
+ }
+ it_behaves_like "multiline strings"
end
describe "vim for cython" do
vim.command "runtime indent/python.vim"
}
- def shiftwidth
- @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i
- end
- def tabstop
- @tabstop ||= vim.echo("&tabstop").to_i
- end
- def indent
- vim.echo("indent('.')").to_i
- end
-
describe "when using a cdef function definition" do
it "indents shiftwidth spaces" do
vim.feedkeys 'icdef long_function_name(\<CR>arg'