From 2a7f8fd51e5cd7f5f8e2d6f8e1fb48a6b178098f Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Sat, 3 Sep 2016 03:27:43 +0200 Subject: [PATCH] Fix indentation of "else" in nested "if" (#59) Fixes https://github.com/hynek/vim-python-pep8-indent/issues/56. --- indent/python.vim | 33 ++++++++++++++++++++------------- spec/indent/indent_spec.rb | 8 ++++++++ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/indent/python.vim b/indent/python.vim index 6bf45a8..b7cebef 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -145,20 +145,26 @@ endfunction " Find possible indent(s) of the block starter that matches the current line. function! s:find_start_of_block(lnum, types, multiple) let r = [] + let types = copy(a:types) let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>' let lnum = a:lnum let last_indent = indent(lnum) + 1 while lnum > 0 && last_indent > 0 let indent = indent(lnum) if indent < last_indent - if getline(lnum) =~# re - if !a:multiple - return [indent] + for type in types + let re = '\v^\s*'.type.'>' + if getline(lnum) =~# re + if !a:multiple + return [indent] + endif + if index(r, indent) == -1 + let r += [indent] + endif + " Remove any handled type, e.g. 'if'. + call remove(types, index(types, type)) endif - if !len(r) || index(r, indent) == -1 - let r += [indent] - endif - endif + endfor let last_indent = indent(lnum) endif let lnum = prevnonblank(lnum - 1) @@ -239,14 +245,15 @@ function! s:indent_like_block(lnum) if len(indents) == 1 return indents[0] endif + " Multiple valid indents, e.g. for 'else' with both try and if. let indent = indent(a:lnum) - for possible_indent in indents - if indent == possible_indent - return indent - endif - endfor - return -2 + if index(indents, indent) != -1 + " The indent is valid, keep it. + return indent + endif + " Fallback to the first/nearest one. + return indents[0] endfor endfor return -2 diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index ecdbcad..ebfd103 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -361,6 +361,14 @@ shared_examples_for "vim" do end end + describe "when an else is used inside of a nested if" do + before { vim.feedkeys 'iif foo:\\if bar:\\\pass\' } + it "indents an else to the inner if" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + describe "when jedi-vim call signatures are used" do before { vim.command 'syn match jediFunction "JEDI_CALL_SIGNATURE" keepend extend' } -- 2.39.2