" Is the syntax at lnum (and optionally cnum) a python string?
function! s:is_python_string(lnum, ...)
let line = getline(a:lnum)
- let linelen = len(line)
- if linelen < 1
- let linelen = 1
+ if a:0
+ let cols = type(a:1) != type([]) ? [a:1] : a:1
+ else
+ let cols = range(1, max([1, len(line)]))
endif
- let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
for cnum in cols
if match(map(synstack(a:lnum, cnum),
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
let prevline = getline(a:lnum-1)
" Multilinestrings: continous, docstring or starting.
- if s:is_python_string(a:lnum-1, len(prevline))
+ if s:is_python_string(a:lnum-1, max([1, len(prevline)]))
\ && (s:is_python_string(a:lnum, 1)
\ || match(line, '^\%("""\|''''''\)') != -1)
endif
if s:is_python_string(a:lnum-1)
- " Previous line is (completely) a string.
- return indent(a:lnum-1)
+ " Previous line is (completely) a string: keep current indent.
+ return -1
endif
if match(prevline, '^\s*\%("""\|''''''\)') != -1
vim.echo('synIDattr(synID(line("."), col("."), 0), "name")'
).downcase.should include 'string'
vim.feedkeys 'a\<CR>'
- proposed_indent.should == 0
+ proposed_indent.should == -1
indent.should == 0
end
end
end
- describe "when after assigning an unfinished string" do
+ describe "when after assigning an indented unfinished string" do
before { vim.feedkeys 'i test = """' }
it "it indents the next line" do
end
end
- describe "when after assigning a finished string" do
+ describe "when after assigning an indented finished string" do
before { vim.feedkeys 'i test = ""' }
it "it does indent the next line" do
end
describe "when breaking a string after opening parenthesis" do
- before { vim.feedkeys 'i foo("""bar<Left><Left><Left>' }
+ before { vim.feedkeys 'i foo("""bar\<Left>\<Left>\<Left>' }
it "it does indent the next line as after an opening multistring" do
vim.feedkeys '\<CR>'
- expected_proposed, expected_indent = multiline_indent(4, 4 + shiftwidth)
+ _, expected_indent = multiline_indent(4, 4 + shiftwidth)
indent.should == expected_indent
- proposed_indent.should == expected_proposed
+ proposed_indent.should == -1
+
+ # it keeps the indent after an empty line
+ vim.feedkeys '\<CR>'
+ proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth)
+ indent.should == expected_indent
+ proposed_indent.should == proposed_indent
+
+ # it keeps the indent of nonblank above
+ vim.feedkeys '\<End>\<CR>'
+ proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth)
+ indent.should == expected_indent
+ proposed_indent.should == proposed_indent
+
+ # it keeps the indent of nonblank above before an empty line
+ vim.feedkeys '\<CR>'
+ proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth)
+ indent.should == expected_indent
+ proposed_indent.should == proposed_indent
end
end
end