From 445ce093b0aaaf767b18c052edbe688e82d18480 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 13 Mar 2014 04:50:20 -0500 Subject: [PATCH] Refix issue #5 (Correct indent after end of block) The implementation clean up reintroduced a more severe version of the bug. Plus, the test was slightly deficient to catch the regression. Problem ------- Given two adjacent blocks where the 2nd block has an equal or smaller indentation level compared to the 1st block. If the 1st block does not end in a stop statement it always sucks up the 2nd block. This changes the meaning of code that already adheres to the pep8 standard. Solution -------- Do not inherit indentation of the previous line if the current line has less indentation but is valid. --- indent/python.vim | 8 ++++++++ spec/indent/indent_spec.rb | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/indent/python.vim b/indent/python.vim index d86eabb..177b8ad 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -179,6 +179,7 @@ function! s:indent_like_previous_line(lnum) let text = getline(lnum) let start = s:find_start_of_multiline_statement(lnum) let base = indent(start) + let current = indent(lnum + 1) " Jump to last character in previous line. call cursor(lnum, len(text)) @@ -215,6 +216,13 @@ function! s:indent_like_previous_line(lnum) return -1 endif + " If this line is dedented and the number of indent spaces is valid + " (multiple of the indentation size), trust the user + let dedent_size = current - indent(a:lnum - 1) + if dedent_size < 0 && current % s:sw() == 0 + return -1 + endif + " In all other cases, line up with the start of the previous statement. return base endfunction diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index cd79e36..1eea365 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -199,7 +199,7 @@ shared_examples_for "vim" do end describe "when current line is dedented compared to previous line" do - before { vim.feedkeys 'i\\if x:\return True\\' } + before { vim.feedkeys 'i\\if x:\y = True\\' } it "and current line has a valid indentation (Part 1)" do vim.feedkeys '0i\if y:' proposed_indent.should == -1 -- 2.39.2