" Maintainer: Hynek Schlawack <hs@ox.cx>
" Prev Maintainer: Eric Mc Sween <em@tomcom.de> (address invalid)
" Original Author: David Bustos <bustos@caltech.edu> (address invalid)
-" Last Change: 2012-06-21
" License: Public Domain
" Only load this indent file when no other was loaded.
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
return -1
endfunction
-function! GetPythonIndent(lnum)
-
+function! GetPythonPEPIndent(lnum)
" First line has indent 0
if a:lnum == 1
return 0
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)
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
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)
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<!"\|''.\{-}\\\@1<!''', '', 'g')
+ else
+ let pline = substitute(pline, '".\{-}\\\@<!"\|''.\{-}\\\@<!''', '', 'g')
+ endif
+ if pline =~ '^[^#]*:\s*\(#.*\)\?$'
return indent(sslnum) + &sw
endif
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