From: Hynek Schlawack Date: Fri, 3 Jan 2014 19:36:41 +0000 (+0100) Subject: Un-indent for "else" after "for" and "try/except" X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/c1bd583a7f217958d2c79621af15cdde13607f58 Un-indent for "else" after "for" and "try/except" Fixes #21 --- diff --git a/indent/python.vim b/indent/python.vim index 4d1edc2..4dcdf8b 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -101,7 +101,6 @@ function! s:BlockStarter(lnum, block_start_re) endfunction function! GetPythonPEPIndent(lnum) - " First line has indent 0 if a:lnum == 1 return 0 @@ -128,8 +127,8 @@ function! GetPythonPEPIndent(lnum) let thisline = getline(a:lnum) let thisindent = indent(a:lnum) - " If the line starts with 'elif' or 'else', line up with 'if' or 'elif' - if thisline =~ '^\s*\(elif\|else\)\>' + " If the line starts with 'elif', line up with 'if' or 'elif' + if thisline =~ '^\s*elif\>' let bslnum = s:BlockStarter(a:lnum, '^\s*\(if\|elif\)\>') if bslnum > 0 return indent(bslnum) @@ -138,8 +137,8 @@ function! GetPythonPEPIndent(lnum) endif endif - " If the line starts with 'except' or 'finally', line up with 'try' - " or 'except' + " If the line starts with 'except', or 'finally', line up with 'try' + " or 'except'. if thisline =~ '^\s*\(except\|finally\)\>' let bslnum = s:BlockStarter(a:lnum, '^\s*\(try\|except\)\>') if bslnum > 0 @@ -149,6 +148,18 @@ function! GetPythonPEPIndent(lnum) endif endif + " If the line starts with 'else', line it up with 'try', 'except', 'for', + " 'if', or 'elif'. + if thisline =~ '^\s*else\>' + :echom thisline + let bslnum = s:BlockStarter(a:lnum, '^\s*\(try\|except\|if\|elif\|for\)\>') + if bslnum > 0 + return indent(bslnum) + else + return -1 + endif + endif + " Examine previous line let plnum = a:lnum - 1 let pline = getline(plnum) diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index eb3c8a6..77b94ef 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -123,6 +123,63 @@ shared_examples_for "vim" do end end + describe "when an 'if' is followed by" do + before { vim.feedkeys 'i\\if x:\' } + it "an elif, it lines up with the 'if'" do + vim.feedkeys 'elif y:' + indent.should == shiftwidth * 2 + end + + it "an 'else', it lines up with the 'if'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + + describe "when a 'for' is followed by" do + before { vim.feedkeys 'i\\for x in y:\' } + it "an 'else', it lines up with the 'for'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + + describe "when a 'try' is followed by" do + before { vim.feedkeys 'i\\try:\' } + it "an 'except', it lines up with the 'try'" do + vim.feedkeys 'except:' + indent.should == shiftwidth * 2 + end + + it "an 'else', it lines up with the 'try'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + + it "a 'finally', it lines up with the 'try'" do + vim.feedkeys 'finally:' + indent.should == shiftwidth * 2 + end + end + + describe "when an 'except' is followed by" do + before { vim.feedkeys 'i\\except:\' } + it "an 'else', it lines up with the 'except'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + + it "another 'except', it lines up with the previous 'except'" do + vim.feedkeys 'except:' + indent.should == shiftwidth * 2 + end + + it "a 'finally', it lines up with the 'except'" do + vim.feedkeys 'finally:' + indent.should == shiftwidth * 2 + end + end + def shiftwidth @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i end