From 7f78cba88013fbf09dde36b762c5374830dd59e1 Mon Sep 17 00:00:00 2001 From: Shougo Matsushita Date: Wed, 14 Mar 2012 09:35:41 +0900 Subject: [PATCH] - Refactored substitute patterns. --- .../sources/snippets_complete.vim | 140 ++++++++++++------ doc/neocomplcache-snippets-complete.txt | 1 + 2 files changed, 97 insertions(+), 44 deletions(-) diff --git a/autoload/neocomplcache/sources/snippets_complete.vim b/autoload/neocomplcache/sources/snippets_complete.vim index 222a208..386e086 100644 --- a/autoload/neocomplcache/sources/snippets_complete.vim +++ b/autoload/neocomplcache/sources/snippets_complete.vim @@ -171,7 +171,8 @@ function! s:source.get_keyword_list(cur_keyword_str)"{{{ let snippets += values(source) endfor - return s:keyword_filter(neocomplcache#dup_filter(snippets), a:cur_keyword_str) + return s:keyword_filter(neocomplcache#dup_filter(snippets), + \ a:cur_keyword_str) endfunction"}}} function! neocomplcache#sources#snippets_complete#define()"{{{ @@ -217,20 +218,22 @@ function! s:keyword_filter(list, cur_keyword_str)"{{{ let prev_word = neocomplcache#get_prev_word(a:cur_keyword_str) " Keyword filter. - let pattern = printf('v:val.word =~ %s && (!has_key(v:val, "prev_word") || v:val.prev_word == %s)', + let pattern = printf('v:val.word =~ %s && (!has_key(v:val, "prev_word") || v:val.prev_word == %s)', \string('^' . keyword_escape), string(prev_word)) let list = filter(a:list, pattern) " Substitute abbr. - let abbr_pattern = printf('%%.%ds..%%s', g:neocomplcache_max_keyword_width-10) + let abbr_pattern = printf('%%.%ds..%%s', + \ g:neocomplcache_max_keyword_width-10) for snippet in list if snippet.snip =~ '\\\@= 0 && \ len(snippet.menu) > g:neocomplcache_max_keyword_width - let snippet.menu = printf(abbr_pattern, snippet.menu, snippet.menu[-8:]) + let snippet.menu = printf(abbr_pattern, + \ snippet.menu, snippet.menu[-8:]) endif let snippet.menu = '`Snip` ' . snippet.menu endif @@ -261,11 +264,13 @@ function! neocomplcache#sources#snippets_complete#force_expandable()"{{{ endfunction"}}} function! neocomplcache#sources#snippets_complete#jumpable()"{{{ " Found snippet placeholder. - return search('\${\d\+\%(:.\{-}\)\?\\\@', 'nw') > 0 + return search(s:get_placeholder_marker_pattern(). '\|' + \ .s:get_sync_placeholder_marker_pattern(), 'nw') > 0 endfunction"}}} function! s:caching()"{{{ - for filetype in neocomplcache#get_source_filetypes(neocomplcache#get_context_filetype(1)) + for filetype in neocomplcache#get_source_filetypes( + \ neocomplcache#get_context_filetype(1)) if !has_key(s:snippets, filetype) call s:caching_snippets(filetype) endif @@ -312,10 +317,10 @@ function! s:set_snippet_pattern(dict)"{{{ \ (a:dict.word =~ '\${\d\+\%(:.\{-}\)\?\\\@ ' : '[Snip] ' - let abbr = has_key(a:dict, 'abbr')? a:dict.abbr : - \ substitute(a:dict.word, - \ '\${\d\+\%(:.\{-}\)\?\\\@\|'. - \ '\$\d\+\|\s\+\|\n', ' ', 'g') + let abbr = get(a:dict, 'abbr', substitute(a:dict.word, + \ s:get_placeholder_marker_pattern(). '\|'. + \ s:get_mirror_placeholder_marker_pattern(). + \ '\|\s\+\|\n', ' ', 'g')) let abbr = (g:neocomplcache_max_keyword_width >= 0 && \ len(abbr) > g:neocomplcache_max_keyword_width)? \ printf(abbr_pattern, abbr, abbr[-8:]) : abbr @@ -368,8 +373,10 @@ function! s:caching_snippets(filetype)"{{{ \ &filetype : a:filetype let snippet = {} - let snippets_files = split(globpath(join(s:snippets_dir, ','), filetype . '.snip*'), '\n') - \ + split(globpath(join(s:snippets_dir, ','), filetype . '_*.snip*'), '\n') + let snippets_files = split(globpath(join(s:snippets_dir, ','), + \ filetype . '.snip*'), '\n') + \ + split(globpath(join(s:snippets_dir, ','), + \ filetype . '_*.snip*'), '\n') for snippets_file in snippets_files call s:load_snippets(snippet, snippets_file) endfor @@ -380,7 +387,8 @@ endfunction"}}} function! s:load_snippets(snippet, snippets_file)"{{{ let dup_check = {} let snippet_pattern = { 'word' : '' } - let abbr_pattern = printf('%%.%ds..%%s', g:neocomplcache_max_keyword_width-10) + let abbr_pattern = printf('%%.%ds..%%s', + \ g:neocomplcache_max_keyword_width-10) let linenr = 1 @@ -393,7 +401,8 @@ function! s:load_snippets(snippet, snippets_file)"{{{ if line =~ '^include' " Include snippets. let snippet_file = matchstr(line, '^include\s\+\zs.*$') - for snippets_file in split(globpath(join(s:snippets_dir, ','), snippet_file), '\n') + for snippets_file in split(globpath(join(s:snippets_dir, ','), + \ snippet_file), '\n') call s:load_snippets(a:snippet, snippets_file) endfor elseif line =~ '^delete\s' @@ -410,11 +419,13 @@ function! s:load_snippets(snippet, snippets_file)"{{{ endif let snippet_pattern.name = - \ substitute(matchstr(line, '^snippet\s\+\zs.*$'), '\s', '_', 'g') + \ substitute(matchstr(line, '^snippet\s\+\zs.*$'), + \ '\s', '_', 'g') " Check for duplicated names. if has_key(dup_check, snippet_pattern.name) - call neocomplcache#print_error('Warning: ' . a:snippets_file . ':' + call neocomplcache#print_error( + \ 'Warning: ' . a:snippets_file . ':' \ . linenr . ': duplicated snippet name `' \ . snippet_pattern.name . '`') call neocomplcache#print_error( @@ -479,14 +490,16 @@ function! s:get_cursor_snippet(snippets, cur_text)"{{{ endfunction"}}} function! s:snippets_force_expand(cur_text, col)"{{{ let cur_word = s:get_cursor_snippet( - \ neocomplcache#sources#snippets_complete#get_snippets(), a:cur_text) + \ neocomplcache#sources#snippets_complete#get_snippets(), + \ a:cur_text) call neocomplcache#sources#snippets_complete#expand( \ a:cur_text, a:col, cur_word) endfunction"}}} function! s:snippets_expand_or_jump(cur_text, col)"{{{ let cur_word = s:get_cursor_keyword_snippet( - \ neocomplcache#sources#snippets_complete#get_snippets(), a:cur_text) + \ neocomplcache#sources#snippets_complete#get_snippets(), + \ a:cur_text) if cur_word != '' " Found snippet trigger. call neocomplcache#sources#snippets_complete#expand( @@ -498,7 +511,8 @@ endfunction"}}} function! s:snippets_jump_or_expand(cur_text, col)"{{{ let cur_word = s:get_cursor_keyword_snippet( \ neocomplcache#sources#snippets_complete#get_snippets(), a:cur_text) - if search('\${\d\+\%(:.\{-}\)\?\\\@', 'nw') > 0 + if search(s:get_placeholder_marker_pattern(). '\|' + \ .s:get_sync_placeholder_marker_pattern(), 'nw') > 0 " Found snippet placeholder. call s:snippets_force_jump(a:cur_text, a:col) else @@ -566,7 +580,7 @@ function! neocomplcache#sources#snippets_complete#expand(cur_text, col, trigger_ startinsert! endif - if snip_word =~ '\${\d\+\%(:.\{-}\)\?\\\@ 0 call s:expand_placeholder(line('.'), 0, '\d\+', line('.')) return 1 @@ -660,11 +675,14 @@ function! s:search_outof_range(col)"{{{ return 0 endfunction"}}} function! s:expand_placeholder(start, end, holder_cnt, line)"{{{ - let pattern = '\${'.a:holder_cnt.'\%(:.\{-}\)\?\\\@ 0 - let pattern = '\${' . cnt . '\%(:.\{-}\)\?\\\@', '')) let pos[2] += len('$<'.cnt.':') @@ -690,12 +709,12 @@ function! s:expand_placeholder(start, end, holder_cnt, line)"{{{ if default_len > 0 " Select default value. let len = default_len-1 - if &l:selection == "exclusive" + if &l:selection == 'exclusive' let len += 1 endif stopinsert - execute "normal! v". repeat('l', len) . "\" + execute 'normal! v'. repeat('l', len) . "\" elseif pos[2] < col('$') startinsert else @@ -705,12 +724,17 @@ endfunction"}}} function! s:search_sync_placeholder(start, end, number)"{{{ if a:end == 0 " Search in current buffer. - let cnt = matchstr(getline(a:start), - \ '\${\zs\d\+\ze\%(:.\{-}\)\?\\\@ 0 ? cnt : 0 + let cnt = matchstr(getline('.'), + \ substitute(s:get_placeholder_marker_pattern(), + \ '\\d\\+', '\\zs\\d\\+\\ze', '')) + return search(substitute( + \ s:get_mirror_placeholder_marker_pattern() + \ '\\d\\+', cnt, ''), 'nw') > 0 ? cnt : 0 endif - let pattern = '\$'.a:number.'\d\@!' + let pattern = substitute( + \ s:get_mirror_placeholder_marker_pattern(), + \ '\\d\\+', a:number, '') for line in filter(range(a:start, a:end), \ 'getline(v:val) =~ pattern') return s:snippet_holder_cnt @@ -721,30 +745,45 @@ endfunction"}}} function! s:substitute_marker(start, end)"{{{ if s:snippet_holder_cnt > 1 let cnt = s:snippet_holder_cnt-1 - let marker = '\$<'.cnt.'\%(:.\{-}\)\?\\\@' + let marker = substitute(s:get_sync_placeholder_marker_pattern(), + \ '\\d\\+', cnt, '') let line = a:start while line <= a:end if getline(line) =~ marker - let sub = escape(matchstr(getline(line), '\$<'.cnt.':\zs.\{-}\ze\\\@'), '/\') - silent! execute printf('%d,%ds/$%d\d\@!/%s/' . (&gdefault ? '' : 'g'), - \a:start, a:end, cnt, sub) - silent! execute line.'s/'.marker.'/'.sub.'/' . (&gdefault ? 'g' : '') + let sub = escape(matchstr(getline(line), + \ substitute(s:get_sync_placeholder_marker_default_pattern(), + \ '\\d\\+', cnt, '')), '/\') + silent! execute printf('%d,%ds/' . substitute( + \ s:get_mirror_placeholder_marker_pattern() + \ '\\d\\+', cnt, '') . '/%s/' + \ . (&gdefault ? '' : 'g'), a:start, a:end, sub) + silent! execute line.'s/'.marker.'/'.sub.'/' + \ . (&gdefault ? 'g' : '') break endif let line += 1 endwhile - elseif search('\$<\d\+\%(:.\{-}\)\?\\\@', 'wb') > 0 - let sub = escape(matchstr(getline('.'), '\$<\d\+:\zs.\{-}\ze\\\@'), '/\') - let cnt = matchstr(getline('.'), '\$<\zs\d\+\ze\%(:.\{-}\)\?\\\@') - silent! execute printf('%%s/$%d\d\@!/%s/' . (&gdefault ? 'g' : ''), cnt, sub) - silent! execute '%s/'.'\$<'.cnt.'\%(:.\{-}\)\?\\\@'.'/'.sub.'/' + elseif search(s:get_sync_placeholder_marker_pattern(), 'wb') > 0 + let sub = escape(matchstr(getline('.'), + \ s:get_sync_placeholder_marker_default_pattern()), '/\') + let cnt = matchstr(getline('.'), + \ substitute(s:get_sync_placeholder_marker_pattern(), + \ '\\d\\+', '\\zs\\d\\+\\ze', '')) + silent! execute printf('%%s/' . substitute( + \ s:get_mirror_placeholder_marker_pattern() + \ '\\d\\+', cnt, '') . '/%s/' + \ . (&gdefault ? 'g' : ''), sub) + let marker = substitute(s:get_sync_placeholder_marker_pattern(), + \ '\\d\\+', cnt, '') + silent! execute '%s/'.marker.'/'.sub.'/' \ . (&gdefault ? 'g' : '') endif endfunction"}}} function! s:trigger(function)"{{{ let cur_text = neocomplcache#get_cur_text(1) - return printf("\:call %s(%s,%d)\", a:function, string(cur_text), col('.')) + return printf("\:call %s(%s,%d)\", + \ a:function, string(cur_text), col('.')) endfunction"}}} function! s:eval_snippet(snippet_text)"{{{ let snip_word = '' @@ -755,7 +794,8 @@ function! s:eval_snippet(snippet_text)"{{{ if match - prev_match > 0 let snip_word .= a:snippet_text[prev_match : match - 1] endif - let prev_match = matchend(a:snippet_text, '\\\@' endfunction"}}} +function! s:get_sync_placeholder_marker_default_pattern()"{{{ + return '\$<\d\+:\zs.\{-}\ze\\\@' +endfunction"}}} function! s:get_mirror_placeholder_marker_pattern()"{{{ return '\$\d\+' endfunction"}}} +function! s:get_mirror_placeholder_marker_substitute_pattern()"{{{ + return '\$\zs\d\+\ze' +endfunction"}}} function! s:SID_PREFIX()"{{{ return matchstr(expand(''), '\d\+_') endfunction"}}} diff --git a/doc/neocomplcache-snippets-complete.txt b/doc/neocomplcache-snippets-complete.txt index 2084b43..1bd6491 100644 --- a/doc/neocomplcache-snippets-complete.txt +++ b/doc/neocomplcache-snippets-complete.txt @@ -298,6 +298,7 @@ CHANGELOG *neocomplcache-snippets-complete-changelog* 2012-03-14 - Refactored expand snippet behavior. - Fixed expand bug. +- Refactored substitute patterns. 2012-03-08 - Use shiftwidth instead of softabstop.