endfunction
endif
-function! s:pair_sort(x, y)
- if a:x[0] == a:y[0]
- return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1
- else
- return a:x[0] > a:y[0] ? 1 : -1
- endif
-endfunction
-
" Find backwards the closest open parenthesis/bracket/brace.
function! s:find_opening_paren(...)
" optional arguments: line and column (defaults to 1) to search around
if index(r, indent) == -1
let r += [indent]
endif
- " Remove any handled type, e.g. 'if'.
- call remove(types, index(types, type))
endif
endfor
let last_indent = indent(lnum)
" indent further to distinguish the continuation line
" from the next logical line.
if text =~# b:control_statement && res == base + s:sw()
- return base + s:sw() * 2
- else
- return res
+ " But only if not inside parens itself (Flake's E127).
+ let [paren_lnum, _] = s:find_opening_paren(paren_lnum)
+ if paren_lnum <= 0
+ return res + s:sw()
+ endif
endif
+ return res
endfunction
" Match indent of first block of this type.
" Is the syntax at lnum (and optionally cnum) a python string?
function! s:is_python_string(lnum, ...)
let line = getline(a:lnum)
- let linelen = len(line)
- if linelen < 1
- let linelen = 1
+ if a:0
+ let cols = type(a:1) != type([]) ? [a:1] : a:1
+ else
+ let cols = range(1, max([1, len(line)]))
endif
- let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
for cnum in cols
if match(map(synstack(a:lnum, cnum),
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
let prevline = getline(a:lnum-1)
" Multilinestrings: continous, docstring or starting.
- if s:is_python_string(a:lnum-1, len(prevline))
+ if s:is_python_string(a:lnum-1, max([1, len(prevline)]))
\ && (s:is_python_string(a:lnum, 1)
\ || match(line, '^\%("""\|''''''\)') != -1)
endif
if s:is_python_string(a:lnum-1)
- " Previous line is (completely) a string.
- return indent(a:lnum-1)
+ " Previous line is (completely) a string: keep current indent.
+ return -1
endif
if match(prevline, '^\s*\%("""\|''''''\)') != -1