From 402f77feb3f069cc2cef1cab5e377048b4873d13 Mon Sep 17 00:00:00 2001 From: Shougo Matsushita Date: Sat, 26 Dec 2015 11:54:30 +0900 Subject: [PATCH] Improve completed snippet feature implementation --- autoload/neosnippet/handlers.vim | 50 ++----------------------------- autoload/neosnippet/parser.vim | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/autoload/neosnippet/handlers.vim b/autoload/neosnippet/handlers.vim index ce15fc7..92ef05a 100644 --- a/autoload/neosnippet/handlers.vim +++ b/autoload/neosnippet/handlers.vim @@ -29,58 +29,14 @@ set cpo&vim function! neosnippet#handlers#_complete_done() "{{{ if empty(v:completed_item) \ || !g:neosnippet#enable_completed_snippet - \ || v:completed_item.word !~ '($' + \ || s:is_auto_pairs() return endif - let pairs = { '(' : ')', '{' : '}', '"' : '"' } - if index(keys(pairs), v:completed_item.word[-1:]) < 0 + let snippet = neosnippet#parser#_get_completed_snippet(v:completed_item) + if snippet == '' return endif - let key = v:completed_item.word[-1:] - let pair = pairs[key] - - 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 - - " Make snippet arguments - let cnt = 1 - let snippet = '' - if key == '(' - for arg in split(substitute(neosnippet#handlers#_get_in_paren(abbr), - \ '(\zs.\{-}\ze)', '', 'g'), '[^[]\zs\s*,\s*') - if arg ==# 'self' && &filetype ==# 'python' - " Ignore self argument - continue - endif - - if cnt != 1 - let snippet .= ', ' - endif - let snippet .= printf('${%d:#:%s}', cnt, escape(arg, '{}')) - let cnt += 1 - endfor - endif - - if !s:is_auto_pairs() - if key != '(' && snippet[-1:] ==# key - let snippet .= '${' . cnt . '}' . pair - let cnt += 1 - elseif snippet[-1:] !=# pair - let snippet .= pair - endif - - let snippet .= '${' . cnt . '}' - endif let [cur_text, col, _] = neosnippet#mappings#_pre_trigger() call neosnippet#view#_insert(snippet, {}, cur_text, col) diff --git a/autoload/neosnippet/parser.vim b/autoload/neosnippet/parser.vim index 292d182..4a2213d 100644 --- a/autoload/neosnippet/parser.vim +++ b/autoload/neosnippet/parser.vim @@ -292,6 +292,57 @@ function! neosnippet#parser#_initialize_snippet_options() "{{{ \ } endfunction"}}} +function! neosnippet#parser#_get_completed_snippet(completed_item) "{{{ + let pairs = { '(' : ')', '{' : '}', '"' : '"' } + if index(keys(pairs), a:completed_item.word[-1:]) < 0 + return '' + endif + let key = a:completed_item.word[-1:] + let pair = pairs[key] + + let item = a: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 + + " Make snippet arguments + let cnt = 1 + let snippet = '' + if key == '(' + for arg in split(substitute(neosnippet#handlers#_get_in_paren(abbr), + \ '(\zs.\{-}\ze)', '', 'g'), '[^[]\zs\s*,\s*') + if arg ==# 'self' && &filetype ==# 'python' + " Ignore self argument + continue + endif + + if cnt != 1 + let snippet .= ', ' + endif + let snippet .= printf('${%d:#:%s}', cnt, escape(arg, '{}')) + let cnt += 1 + endfor + endif + + if key != '(' && snippet[-1:] ==# key + let snippet .= '${' . cnt . '}' . pair + let cnt += 1 + elseif snippet[-1:] !=# pair + let snippet .= pair + endif + + let snippet .= '${' . cnt . '}' + + return snippet +endfunction"}}} + let &cpo = s:save_cpo unlet s:save_cpo