X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/c0139ddbe2ac7157848d2bf8ac8594bf5c7e8558..18593f1150972346884dac64d7e71fd6a5f2b0fc:/indent/python.vim diff --git a/indent/python.vim b/indent/python.vim index 1dabb47..c632c7b 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -15,7 +15,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,7 +101,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 @@ -160,15 +160,17 @@ 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 @@ -189,6 +191,13 @@ function! GetPythonIndent(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