From 18593f1150972346884dac64d7e71fd6a5f2b0fc Mon Sep 17 00:00:00 2001 From: has2k1 Date: Thu, 31 Oct 2013 05:17:16 -0500 Subject: [PATCH 1/1] Fix issue #5 (Correct indent after end of block) Problem ------- Given two adjacent blocks where the 2nd block has an equal or smaller indentation level compared to the 1st block. If the blocks are not separated by an empty line, the 2nd block will be placed (indented) inside the 1st 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 | 7 +++++++ spec/indent/indent_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/indent/python.vim b/indent/python.vim index 2c30547..c632c7b 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -191,6 +191,13 @@ function! GetPythonPEPIndent(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 = thisindent - indent(plnum) + if dedent_size < 0 && thisindent % &sw == 0 + return -1 + endif + " In all other cases, line up with the start of the previous statement. return indent(sslnum) endfunction diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index 932a091..38ce192 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -91,6 +91,24 @@ describe "vim" do end end + describe "when current line is dedented compared to previous line" do + before { vim.feedkeys 'i\\if x:\return True\\' } + it "and current line has a valid indentation (Part 1)" do + vim.feedkeys '0i\if y:' + proposed_indent.should == -1 + end + + it "and current line has a valid indentation (Part 2)" do + vim.feedkeys '0i\\if y:' + proposed_indent.should == -1 + end + + it "and current line has an invalid indentation" do + vim.feedkeys 'i while True:\' + indent.should == previous_indent + shiftwidth + end + end + def shiftwidth @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i end @@ -100,6 +118,10 @@ describe "vim" do def indent vim.echo("indent('.')").to_i end + def previous_indent + pline = vim.echo("line('.')").to_i - 1 + vim.echo("indent('#{pline}')").to_i + end def proposed_indent line = vim.echo("line('.')") col = vim.echo("col('.')") -- 2.39.5