Fix paren parser

This commit is contained in:
Shougo Matsushita 2015-09-01 05:56:41 +09:00
parent d4a154ff6d
commit 1617094a8c
2 changed files with 39 additions and 1 deletions

View File

@ -60,7 +60,9 @@ function! neosnippet#handlers#_complete_done() "{{{
if snippet !~ '()\?$'
let snippet .= '('
endif
for arg in split(matchstr(abbr, '(\zs.\{-}\ze)'), '[^[]\zs\s*,\s*')
for arg in split(substitute(neosnippet#handlers#_get_in_paren(abbr),
\ '(\zs.\{-}\ze)', '', 'g'), '[^[]\zs\s*,\s*')
if cnt != 1
let snippet .= ', '
endif
@ -100,6 +102,30 @@ function! neosnippet#handlers#_cursor_moved() "{{{
endif
endfunction"}}}
function! neosnippet#handlers#_get_in_paren(str) abort "{{{
let s = ''
let level = 0
for c in split(a:str, '\zs')
if c == '('
let level += 1
if level == 1
continue
endif
elseif c == ')'
if level == 1
return s
else
let level -= 1
endif
endif
let s .= c
endfor
return s
endfunction"}}}
let &cpo = s:save_cpo
unlet s:save_cpo

12
test/functions.vim Normal file
View File

@ -0,0 +1,12 @@
let s:suite = themis#suite('toml')
let s:assert = themis#helper('assert')
function! s:suite.get_in_paren()
call s:assert.equals(neosnippet#handlers#_get_in_paren('(foobar)'),
\ 'foobar')
call s:assert.equals(neosnippet#handlers#_get_in_paren('(foobar, baz)'),
\ 'foobar, baz')
call s:assert.equals(neosnippet#handlers#_get_in_paren('(foobar, (baz))'),
\ 'foobar, (baz)')
endfunction