mirror of
https://github.com/Raimondi/delimitMate.git
synced 2026-02-28 04:22:31 +08:00
Do not close on unbalanced parens.
This commit is contained in:
@@ -106,6 +106,15 @@ function! delimitMate#Init() "{{{
|
|||||||
" Nothing to do.
|
" Nothing to do.
|
||||||
endif " }}}
|
endif " }}}
|
||||||
|
|
||||||
|
" delimitMate_unbalanced_parens {{{
|
||||||
|
if !exists("b:delimitMate_unbalanced_parens") && !exists("g:delimitMate_unbalanced_parens")
|
||||||
|
let b:delimitMate_unbalanced_parens = 0
|
||||||
|
elseif !exists("b:delimitMate_unbalanced_parens") && exists("g:delimitMate_unbalanced_parens")
|
||||||
|
let b:delimitMate_unbalanced_parens = g:delimitMate_unbalanced_parens
|
||||||
|
else
|
||||||
|
" Nothing to do.
|
||||||
|
endif " }}}
|
||||||
|
|
||||||
let b:delimitMate_matchpairs_list = split(s:matchpairs_temp, ',')
|
let b:delimitMate_matchpairs_list = split(s:matchpairs_temp, ',')
|
||||||
let b:delimitMate_left_delims = split(s:matchpairs_temp, ':.,\=')
|
let b:delimitMate_left_delims = split(s:matchpairs_temp, ':.,\=')
|
||||||
let b:delimitMate_right_delims = split(s:matchpairs_temp, ',\=.:')
|
let b:delimitMate_right_delims = split(s:matchpairs_temp, ',\=.:')
|
||||||
@@ -349,6 +358,51 @@ function! delimitMate#FlushBuffer() " {{{
|
|||||||
return ''
|
return ''
|
||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
|
function! delimitMate#BalancedParens(char) "{{{
|
||||||
|
" Returns:
|
||||||
|
" = 0 => Parens balanced.
|
||||||
|
" > 0 => More opening parens.
|
||||||
|
" < 0 => More closing parens.
|
||||||
|
|
||||||
|
let line = getline('.')
|
||||||
|
let col = col('.') - 2
|
||||||
|
let col = col >= 0 ? col : 0
|
||||||
|
let list = split(line, '\zs')
|
||||||
|
let left = b:delimitMate_left_delims[index(b:delimitMate_right_delims, a:char)]
|
||||||
|
let right = a:char
|
||||||
|
let opening = 0
|
||||||
|
let closing = 0
|
||||||
|
|
||||||
|
" If the cursor is not at the beginning, count what's behind it.
|
||||||
|
if col > 0
|
||||||
|
" Find the first opening paren:
|
||||||
|
let start = index(list, left)
|
||||||
|
" Must be before cursor:
|
||||||
|
let start = start < col ? start : col - 1
|
||||||
|
" Now count from the first opening until the cursor, this will prevent
|
||||||
|
" extra closing parens from being counted.
|
||||||
|
let opening = count(list[start : col - 1], left)
|
||||||
|
let closing = count(list[start : col - 1], right)
|
||||||
|
" I don't care if there are more closing parens than opening parens.
|
||||||
|
let closing = closing > opening ? opening : closing
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Evaluate parens from the cursor to the end:
|
||||||
|
let opening += count(list[col :], left)
|
||||||
|
let closing += count(list[col :], right)
|
||||||
|
|
||||||
|
"echom "–––––––––"
|
||||||
|
"echom line
|
||||||
|
"echom col
|
||||||
|
""echom left.":".a:char
|
||||||
|
"echom string(list)
|
||||||
|
"echom string(list[start : col - 1]) . " : " . string(list[col :])
|
||||||
|
"echom opening . " - " . closing . " = " . (opening - closing)
|
||||||
|
|
||||||
|
" Return the found balance:
|
||||||
|
return opening - closing
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
" }}}
|
" }}}
|
||||||
|
|
||||||
" Doers {{{
|
" Doers {{{
|
||||||
@@ -386,6 +440,10 @@ function! delimitMate#ParenDelim(char) " {{{
|
|||||||
if delimitMate#IsForbidden(a:char)
|
if delimitMate#IsForbidden(a:char)
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
|
if b:delimitMate_unbalanced_parens &&
|
||||||
|
\ delimitMate#BalancedParens(a:char) <= 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
let line = getline('.')
|
let line = getline('.')
|
||||||
let col = col('.')-2
|
let col = col('.')-2
|
||||||
if (col) < 0
|
if (col) < 0
|
||||||
|
|||||||
@@ -561,7 +561,7 @@ This script was inspired by the auto-completion of delimiters on TextMate.
|
|||||||
Version Date Release notes ~
|
Version Date Release notes ~
|
||||||
|---------|------------|-----------------------------------------------------|
|
|---------|------------|-----------------------------------------------------|
|
||||||
2.4DEV 2010-06-06 * Current release:
|
2.4DEV 2010-06-06 * Current release:
|
||||||
- xxx
|
- Unbalanced parens: see :help delimitMateBalance.
|
||||||
|
|
||||||
|---------|------------|-----------------------------------------------------|
|
|---------|------------|-----------------------------------------------------|
|
||||||
2.3.1 2010-06-06 * - Fix: an extra <Space> is inserted after <Space>
|
2.3.1 2010-06-06 * - Fix: an extra <Space> is inserted after <Space>
|
||||||
|
|||||||
Reference in New Issue
Block a user