diff --git a/autoload/neocomplete/sources/neosnippet.vim b/autoload/neocomplete/sources/neosnippet.vim index fb04c65..481ad11 100644 --- a/autoload/neocomplete/sources/neosnippet.vim +++ b/autoload/neocomplete/sources/neosnippet.vim @@ -37,7 +37,7 @@ let s:source = { \} function! s:source.gather_candidates(context) "{{{ - let snippets = values(neosnippet#helpers#get_snippets()) + let snippets = values(neosnippet#helpers#get_completion_snippets()) if matchstr(a:context.input, '\S\+$') !=# \ matchstr(a:context.input, '\w\+$') " Word filtering diff --git a/autoload/neosnippet/handlers.vim b/autoload/neosnippet/handlers.vim new file mode 100644 index 0000000..3700d69 --- /dev/null +++ b/autoload/neosnippet/handlers.vim @@ -0,0 +1,83 @@ +"============================================================================= +" FILE: handlers.vim +" AUTHOR: Shougo Matsushita +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= + +let s:save_cpo = &cpo +set cpo&vim + +function! neosnippet#handlers#_complete_done() "{{{ + if empty(v:completed_item) + return + endif + + let item = v:completed_item + + let abbr = (item.abbr != '') ? item.abbr : item.word + if len(item.menu) > 5 + " Combine menu. + let abbr .= ' ' . item.menu + endif + + if item.info != '' + let abbr = split(item.info, '\n')[0] + endif + + if abbr !~ '(.*)' + return + endif + + " Make snippet arguments + let cnt = 1 + let snippet = item.word + if snippet !~ '($' + let snippet .= '(' + endif + for arg in split(matchstr(abbr, '(\zs.\{-}\ze)'), '[^[]\zs\s*,\s*') + if cnt != 1 + let snippet .= ', ' + endif + let snippet .= printf('${%d:#%s}', cnt, escape(arg, '{}')) + let cnt += 1 + endfor + if snippet !~ ')$' + let snippet .= ')' + endif + let snippet .= '${0}' + + let trigger = item.word + let options = neosnippet#parser#_initialize_snippet_options() + let options.word = 1 + let options.oneshot = 1 + + let neosnippet = neosnippet#variables#current_neosnippet() + let neosnippet.snippets[trigger] = + \ neosnippet#parser#_initialize_snippet( + \ { 'name' : trigger, 'word' : snippet, 'options' : options }, + \ '', 0, '', trigger) +endfunction"}}} + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: foldmethod=marker diff --git a/autoload/neosnippet/helpers.vim b/autoload/neosnippet/helpers.vim index 7bf457b..3c66243 100644 --- a/autoload/neosnippet/helpers.vim +++ b/autoload/neosnippet/helpers.vim @@ -68,6 +68,10 @@ function! neosnippet#helpers#get_snippets() "{{{ return snippets endfunction"}}} +function! neosnippet#helpers#get_completion_snippets() "{{{ + return filter(neosnippet#helpers#get_snippets(), + \ "!get(v:val.options, 'oneshot', 0)") +endfunction"}}} function! neosnippet#helpers#get_snippets_directory() "{{{ let snippets_dir = copy(neosnippet#variables#snippets_dir()) diff --git a/autoload/neosnippet/init.vim b/autoload/neosnippet/init.vim index 768867a..ec4fff6 100644 --- a/autoload/neosnippet/init.vim +++ b/autoload/neosnippet/init.vim @@ -91,6 +91,11 @@ function! s:initialize_others() "{{{ autocmd BufWritePre * NeoSnippetClearMarkers augroup END"}}} + if exists('v:completed_item') + autocmd neosnippet CompleteDone * + \ call neosnippet#handlers#_complete_done() + endif + augroup neosnippet autocmd BufNewFile,BufRead,Syntax * \ execute 'syntax match neosnippetExpandSnippets' diff --git a/autoload/neosnippet/mappings.vim b/autoload/neosnippet/mappings.vim index 5a3f38b..2a6e242 100644 --- a/autoload/neosnippet/mappings.vim +++ b/autoload/neosnippet/mappings.vim @@ -82,6 +82,7 @@ function! neosnippet#mappings#_register_oneshot_snippet() "{{{ let neosnippet = neosnippet#variables#current_neosnippet() let options = neosnippet#parser#_initialize_snippet_options() let options.word = 1 + let options.oneshot = 1 let neosnippet.snippets[trigger] = neosnippet#parser#_initialize_snippet( \ { 'name' : trigger, 'word' : selected_text, 'options' : options }, diff --git a/autoload/neosnippet/parser.vim b/autoload/neosnippet/parser.vim index 517af6f..70bd4cb 100644 --- a/autoload/neosnippet/parser.vim +++ b/autoload/neosnippet/parser.vim @@ -254,8 +254,13 @@ function! neosnippet#parser#_initialize_snippet(dict, path, line, pattern, name) endfunction"}}} function! neosnippet#parser#_initialize_snippet_options() "{{{ - return { 'head' : 0, 'word' : - \ g:neosnippet#expand_word_boundary, 'indent' : 0 } + return { + \ 'head' : 0, + \ 'word' : + \ g:neosnippet#expand_word_boundary, + \ 'indent' : 0, + \ 'oneshot' : 0, + \ } endfunction"}}} let &cpo = s:save_cpo diff --git a/autoload/unite/sources/neosnippet.vim b/autoload/unite/sources/neosnippet.vim index 59c8eb6..8aca763 100644 --- a/autoload/unite/sources/neosnippet.vim +++ b/autoload/unite/sources/neosnippet.vim @@ -50,7 +50,7 @@ function! s:source.hooks.on_init(args, context) "{{{ let a:context.source__cur_keyword_pos = \ s:get_keyword_pos(neosnippet#util#get_cur_text()) let a:context.source__snippets = - \ sort(values(neosnippet#helpers#get_snippets())) + \ sort(values(neosnippet#helpers#get_completion_snippets())) endfunction"}}} function! s:source.gather_candidates(args, context) "{{{ diff --git a/rplugin/python3/deoplete/sources/neosnippet.py b/rplugin/python3/deoplete/sources/neosnippet.py index 6bac506..feafee8 100644 --- a/rplugin/python3/deoplete/sources/neosnippet.py +++ b/rplugin/python3/deoplete/sources/neosnippet.py @@ -34,7 +34,7 @@ class Source(Base): self.mark = '[nsnip]' def gather_candidates(self, context): - return self.vim.eval('values(neosnippet#helpers#get_snippets())') + return self.vim.eval('values(neosnippet#helpers#get_completion_snippets())') def on_post_filter(self, context): for candidate in context['candidates']: