From: Daniel Hahler Date: Mon, 9 Oct 2017 02:18:35 +0000 (+0200) Subject: Improve s:find_start_of_multiline_statement: only look for round parens X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/922268fbd89a49991b5b5b73e969f8daa8a10263?ds=inline;hp=--cc Improve s:find_start_of_multiline_statement: only look for round parens --- 922268fbd89a49991b5b5b73e969f8daa8a10263 diff --git a/indent/python.vim b/indent/python.vim index 20469e2..22ca76f 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -45,6 +45,10 @@ let s:block_rules_multiple = { " Pairs to look for when searching for opening parenthesis. " The value is the maximum offset in lines. let s:paren_pairs = {'()': 10, '[]': 100, '{}': 1000} + +" Maximum offset when looking for multiline statements (in round parenthesis). +let s:maxoff_multiline_statement = 50 + if &filetype ==# 'pyrex' || &filetype ==# 'cython' let b:control_statement = '\v^\s*(class|def|if|while|with|for|except|cdef|cpdef)>' else @@ -121,19 +125,21 @@ function! s:find_opening_paren(...) return nearest endfunction -" Find the start of a multi-line statement +" Find the start of a multi-line statement (based on surrounding parens). function! s:find_start_of_multiline_statement(lnum) let lnum = a:lnum while lnum > 0 + " XXX: not tested?! if getline(lnum - 1) =~# '\\$' let lnum = prevnonblank(lnum - 1) else - let [paren_lnum, _] = s:find_opening_paren(lnum) - if paren_lnum < 1 - return lnum - else - let lnum = paren_lnum + call cursor(lnum, 1) + let stopline = max([1, lnum - s:maxoff_multiline_statement]) + let pos = searchpairpos('\V(', '', '\V)', 'bnW', s:skip_special_chars, stopline) + if pos[0] + return pos[0] endif + return lnum endif endwhile endfunction