"============================================================================= " FILE: commands.vim " AUTHOR: Shougo Matsushita " License: MIT license "============================================================================= " Variables let s:edit_options = [ \ '-runtime', \ '-vertical', '-horizontal', '-direction=', '-split', \] let s:Cache = neosnippet#util#get_vital().import('System.Cache.Deprecated') function! s:get_list() abort if !exists('s:List') let s:List = vital#of('neosnippet').import('Data.List') endif return s:List endfunction function! neosnippet#commands#_edit(args) abort if neosnippet#util#is_sudo() call neosnippet#util#print_error( \ '"sudo vim" is detected. This feature is disabled.') return endif call neosnippet#init#check() let [args, options] = neosnippet#util#parse_options( \ a:args, s:edit_options) let filetype = get(args, 0, '') if filetype == '' let filetype = neosnippet#helpers#get_filetype() endif let options = s:initialize_options(options) let snippet_dir = (options.runtime ? \ get(neosnippet#get_runtime_snippets_directory(), 0, '') : \ get(neosnippet#get_user_snippets_directory(), -1, '')) if snippet_dir == '' call neosnippet#util#print_error('Snippet directory is not found.') return endif if !isdirectory(snippet_dir) && !neosnippet#util#is_sudo() call mkdir(snippet_dir, 'p') endif " Edit snippet file. let filename = snippet_dir .'/'.filetype if isdirectory(filename) " Edit in snippet directory. let filename .= '/'.filetype endif if filename !~ '\.snip*$' let filename .= '.snip' endif if options.split " Split window. execute options.direction \ (options.vertical ? 'vsplit' : 'split') endif try execute 'edit' fnameescape(filename) catch /^Vim\%((\a\+)\)\=:E749/ endtry endfunction function! neosnippet#commands#_make_cache(filetype) abort call neosnippet#init#check() let filetype = a:filetype == '' ? \ &filetype : a:filetype if filetype ==# '' let filetype = 'nothing' endif let snippets = neosnippet#variables#snippets() if has_key(snippets, filetype) return endif let snippets[filetype] = {} let path = join(neosnippet#helpers#get_snippets_directory(), ',') let cache_dir = neosnippet#variables#data_dir() for filename in s:get_snippets_files(path, filetype) " Clear cache file call s:Cache.deletefile(cache_dir, filename) let snippets[filetype] = extend(snippets[filetype], \ neosnippet#parser#_parse_snippets(filename)) endfor if g:neosnippet#enable_snipmate_compatibility " Load file snippets for filename in s:get_snippet_files(path, filetype) let trigger = fnamemodify(filename, ':t:r') let snippets[filetype][trigger] = \ neosnippet#parser#_parse_snippet(filename, trigger) endfor endif endfunction function! neosnippet#commands#_source(filename) abort call neosnippet#init#check() let neosnippet = neosnippet#variables#current_neosnippet() let neosnippet.snippets = extend(neosnippet.snippets, \ neosnippet#parser#_parse_snippets(a:filename)) endfunction function! neosnippet#commands#_clear_markers() abort let expand_stack = neosnippet#variables#expand_stack() " Get patterns and count. if !&l:modifiable || !&l:modified \ || empty(expand_stack) \ || neosnippet#variables#current_neosnippet().trigger return endif call neosnippet#view#_clear_markers(expand_stack[-1]) endfunction " Complete helpers. function! neosnippet#commands#_edit_complete(arglead, cmdline, cursorpos) abort return filter(s:edit_options + \ neosnippet#commands#_filetype_complete(a:arglead, a:cmdline, a:cursorpos), \ 'stridx(v:val, a:arglead) == 0') endfunction function! neosnippet#commands#_filetype_complete(arglead, cmdline, cursorpos) abort " Dup check. let ret = {} for item in map( \ split(globpath(&runtimepath, 'syntax/*.vim'), '\n') + \ split(globpath(&runtimepath, 'indent/*.vim'), '\n') + \ split(globpath(&runtimepath, 'ftplugin/*.vim'), '\n') \ , 'fnamemodify(v:val, ":t:r")') if !has_key(ret, item) && item =~ '^'.a:arglead let ret[item] = 1 endif endfor return sort(keys(ret)) endfunction function! neosnippet#commands#_complete_target_snippets(arglead, cmdline, cursorpos) abort return map(filter(values(neosnippet#helpers#get_snippets()), \ "stridx(v:val.word, a:arglead) == 0 \ && v:val.snip =~# neosnippet#get_placeholder_target_marker_pattern()"), 'v:val.word') endfunction function! s:initialize_options(options) abort let default_options = { \ 'runtime' : 0, \ 'vertical' : 0, \ 'direction' : 'below', \ 'split' : 0, \ } let options = extend(default_options, a:options) " Complex initializer. if has_key(options, 'horizontal') " Disable vertically. let options.vertical = 0 endif return options endfunction function! s:get_snippets_files(path, filetype) abort let snippets_files = [] for glob in s:get_list().flatten( \ map(split(get(g:neosnippet#scope_aliases, \ a:filetype, a:filetype), '\s*,\s*'), " \ [v:val.'.snip', v:val.'.snippets', \ v:val.'/**/*.snip', v:val.'/**/*.snippets'] \ + (a:filetype != '_' && \ !has_key(g:neosnippet#scope_aliases, a:filetype) ? \ [v:val . '_*.snip', v:val . '_*.snippets'] : [])")) let snippets_files += split(globpath(a:path, glob), '\n') endfor return reverse(s:get_list().uniq(snippets_files)) endfunction function! s:get_snippet_files(path, filetype) abort let snippet_files = [] for glob in s:get_list().flatten( \ map(split(get(g:neosnippet#scope_aliases, \ a:filetype, a:filetype), '\s*,\s*'), " \ [v:val.'/*.snippet']")) let snippet_files += split(globpath(a:path, glob), '\n') endfor return reverse(s:get_list().uniq(snippet_files)) endfunction