diff --git a/autoload/neosnippet/mappings.vim b/autoload/neosnippet/mappings.vim index 5810e67..bf7ca46 100644 --- a/autoload/neosnippet/mappings.vim +++ b/autoload/neosnippet/mappings.vim @@ -47,7 +47,8 @@ function! neosnippet#mappings#completed_expandable() abort "{{{ endif let snippet = neosnippet#parser#_get_completed_snippet( - \ v:completed_item, neosnippet#util#get_next_text()) + \ v:completed_item, neosnippet#util#get_cur_text(), + \ neosnippet#util#get_next_text()) return snippet != '' endfunction"}}} function! s:enabled_completed_snippet() abort "{{{ @@ -170,7 +171,7 @@ endfunction"}}} function! s:snippets_expand(cur_text, col) abort "{{{ if s:enabled_completed_snippet() let snippet = neosnippet#parser#_get_completed_snippet( - \ v:completed_item, neosnippet#util#get_next_text()) + \ v:completed_item, a:cur_text, neosnippet#util#get_next_text()) if snippet != '' call neosnippet#view#_insert(snippet, {}, a:cur_text, a:col) return 0 diff --git a/autoload/neosnippet/parser.vim b/autoload/neosnippet/parser.vim index 7c1976d..9f98ad5 100644 --- a/autoload/neosnippet/parser.vim +++ b/autoload/neosnippet/parser.vim @@ -298,10 +298,14 @@ function! neosnippet#parser#_initialize_snippet_options() abort "{{{ \ } endfunction"}}} -function! neosnippet#parser#_get_completed_snippet(completed_item, next_text) abort "{{{ +function! neosnippet#parser#_get_completed_snippet(completed_item, cur_text, next_text) abort "{{{ let item = a:completed_item - if has_key(item, "snippet") + if strridx(a:cur_text, item.word) != len(a:cur_text) - len(item.word) + return '' + endif + + if has_key(item, 'snippet') return item.snippet endif diff --git a/test/functions.vim b/test/functions.vim index f8db058..062a41a 100644 --- a/test/functions.vim +++ b/test/functions.vim @@ -36,102 +36,107 @@ function! s:suite.get_completed_snippet() abort call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo()', \ 'menu' : '', 'info' : '' - \ }, ''), ')${1}') + \ }, 'foo(', ''), ')${1}') + + call s:assert.equals(neosnippet#parser#_get_completed_snippet({ + \ 'word' : 'foo(', 'abbr' : 'foo()', + \ 'menu' : '', 'info' : '' + \ }, 'foo)', ''), '') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : '', \ 'menu' : '', 'info' : '' - \ }, ''), '${1})${2}') + \ }, 'foo(', ''), '${1})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(hoge)', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:hoge})${2}') + \ }, 'foo(', ''), '${1:#:hoge})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo', 'abbr' : 'foo(hoge)', \ 'menu' : '', 'info' : '' - \ }, ''), '(${1:#:hoge})${2}') + \ }, 'foo', ''), '(${1:#:hoge})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(hoge, piyo)', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:hoge}, ${2:#:piyo})${3}') + \ }, 'foo(', ''), '${1:#:hoge}, ${2:#:piyo})${3}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(hoge, piyo(foobar))', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:hoge}, ${2:#:piyo()})${3}') + \ }, 'foo(', ''), '${1:#:hoge}, ${2:#:piyo()})${3}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(hoge[, abc])', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:hoge[, abc]})${2}') + \ }, 'foo(', ''), '${1:#:hoge[, abc]})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(...)', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:...})${2}') + \ }, 'foo(', ''), '${1:#:...})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo(', 'abbr' : 'foo(hoge, ...)', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:hoge}${2:#:, ...})${3}') + \ }, 'foo(', ''), '${1:#:hoge}${2:#:, ...})${3}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo{', 'abbr' : 'foo{', \ 'menu' : '', 'info' : '' - \ }, ''), '${1}}${2}') + \ }, 'foo{', ''), '${1}}${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'foo{', 'abbr' : 'foo{piyo}', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:piyo}}${2}') + \ }, 'foo{', ''), '${1:#:piyo}}${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary', 'abbr' : 'Dictionary(foo)', \ 'menu' : '', 'info' : '' - \ }, ''), '<${1:#:Key}, ${2:#:Value}>(${3:#:foo})${4}') + \ }, 'Dictionary', ''), '<${1:#:Key}, ${2:#:Value}>(${3:#:foo})${4}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary(', \ 'abbr' : 'Dictionary Dictionary(foo)', \ 'menu' : '', 'info' : '' - \ }, ''), '${1:#:foo})${2}') + \ }, 'Dictionary(', ''), '${1:#:foo})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary(', 'abbr' : '', \ 'menu' : '', 'info' : '' - \ }, '('), '') + \ }, 'Dictionary(', '('), '') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary(', 'abbr' : 'Dictionary(foo)', \ 'menu' : '', 'info' : '' - \ }, '('), '') + \ }, 'Dictionary(', '('), '') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary(', 'abbr' : 'Dictionary(foo)', \ 'menu' : '', 'info' : '' - \ }, ')'), '${1:#:foo})${2}') + \ }, 'Dictionary(', ')'), '${1:#:foo})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'Dictionary', 'abbr' : 'Dictionary(foo)', \ 'menu' : '', 'info' : '' - \ }, ''), '(${1:#:foo})${2}') + \ }, 'Dictionary', ''), '(${1:#:foo})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'forEach', 'abbr' : 'forEach(BiConsumer)', \ 'menu' : '', 'info' : '' - \ }, ''), '(${1:#:BiConsumer<>})${2}') + \ }, 'forEach', ''), '(${1:#:BiConsumer<>})${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'for[', 'abbr' : '', \ 'menu' : '', 'info' : '' - \ }, ''), '${1}]${2}') + \ }, 'for[', ''), '${1}]${2}') call s:assert.equals(neosnippet#parser#_get_completed_snippet({ \ 'word' : 'something', 'abbr' : 'something(else)', \ 'menu' : '', 'info' : '', 'snippet' : '(${1:custom})${2}' - \ }, ''), '(${1:custom})${2}') + \ }, 'something', ''), '(${1:custom})${2}') endfunction