X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/ec58e0b03964e458970e0f3a5629a656fa1e4c35..c1bd583a7f217958d2c79621af15cdde13607f58:/indent/python.vim diff --git a/indent/python.vim b/indent/python.vim index 82f0d7c..4dcdf8b 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -3,7 +3,6 @@ " Maintainer: Hynek Schlawack " Prev Maintainer: Eric Mc Sween (address invalid) " Original Author: David Bustos (address invalid) -" Last Change: 2012-06-21 " License: Public Domain " Only load this indent file when no other was loaded. @@ -15,7 +14,7 @@ let b:did_indent = 1 setlocal expandtab setlocal nolisp setlocal autoindent -setlocal indentexpr=GetPythonIndent(v:lnum) +setlocal indentexpr=GetPythonPEPIndent(v:lnum) setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except let s:maxoff = 50 @@ -101,8 +100,7 @@ function! s:BlockStarter(lnum, block_start_re) return -1 endfunction -function! GetPythonIndent(lnum) - +function! GetPythonPEPIndent(lnum) " First line has indent 0 if a:lnum == 1 return 0 @@ -129,8 +127,8 @@ function! GetPythonIndent(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) @@ -139,8 +137,8 @@ function! GetPythonIndent(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 @@ -150,6 +148,18 @@ function! GetPythonIndent(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) @@ -160,21 +170,29 @@ function! GetPythonIndent(lnum) return -1 endif - " If this line is explicitly joined, try to find an indentation that looks - " good. + " If this line is explicitly joined, find the first indentation that is a + " multiple of four and will distinguish itself from next logical line. if pline =~ '\\$' - let compound_statement = '^\s*\(if\|while\|for\s.*\sin\|except\)\s*' - let maybe_indent = matchend(getline(sslnum), compound_statement) - if maybe_indent != -1 - return maybe_indent + let maybe_indent = indent(sslnum) + &sw + let control_structure = '^\s*\(if\|while\|for\s.*\sin\|except\)\s*' + if match(getline(sslnum), control_structure) != -1 + " add extra indent to avoid E125 + return maybe_indent + &sw else - return indent(sslnum) + &sw * 2 + " control structure not found + return maybe_indent endif endif - " If the previous line ended with a colon, indent relative to - " statement start. - if pline =~ ':\s*$' + " If the previous line ended with a colon and is not a comment, indent + " relative to statement start. + let pline = substitute(pline, '\\\\', '', 'g') + if v:version > 703 || (v:version == 703 && has('patch1037')) + let pline = substitute(pline, '".\{-}\\\@1