You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

212 lines
6.2 KiB

  1. "=============================================================================
  2. " FILE: commands.vim
  3. " AUTHOR: Shougo Matsushita <Shougo.Matsu@gmail.com>
  4. " License: MIT license
  5. "=============================================================================
  6. let s:save_cpo = &cpo
  7. set cpo&vim
  8. " Variables "{{{
  9. let s:edit_options = [
  10. \ '-runtime',
  11. \ '-vertical', '-horizontal', '-direction=', '-split',
  12. \]
  13. let s:Cache = neosnippet#util#get_vital().import('System.Cache.Deprecated')
  14. "}}}
  15. function! s:get_list() abort "{{{
  16. if !exists('s:List')
  17. let s:List = vital#of('neosnippet').import('Data.List')
  18. endif
  19. return s:List
  20. endfunction"}}}
  21. function! neosnippet#commands#_edit(args) abort "{{{
  22. if neosnippet#util#is_sudo()
  23. call neosnippet#util#print_error(
  24. \ '"sudo vim" is detected. This feature is disabled.')
  25. return
  26. endif
  27. call neosnippet#init#check()
  28. let [args, options] = neosnippet#util#parse_options(
  29. \ a:args, s:edit_options)
  30. let filetype = get(args, 0, '')
  31. if filetype == ''
  32. let filetype = neosnippet#helpers#get_filetype()
  33. endif
  34. let options = s:initialize_options(options)
  35. let snippet_dir = (options.runtime ?
  36. \ get(neosnippet#get_runtime_snippets_directory(), 0, '') :
  37. \ get(neosnippet#get_user_snippets_directory(), -1, ''))
  38. if snippet_dir == ''
  39. call neosnippet#util#print_error('Snippet directory is not found.')
  40. return
  41. endif
  42. if !isdirectory(snippet_dir) && !neosnippet#util#is_sudo()
  43. call mkdir(snippet_dir, 'p')
  44. endif
  45. " Edit snippet file.
  46. let filename = snippet_dir .'/'.filetype
  47. if isdirectory(filename)
  48. " Edit in snippet directory.
  49. let filename .= '/'.filetype
  50. endif
  51. if filename !~ '\.snip*$'
  52. let filename .= '.snip'
  53. endif
  54. if options.split
  55. " Split window.
  56. execute options.direction
  57. \ (options.vertical ? 'vsplit' : 'split')
  58. endif
  59. try
  60. execute 'edit' fnameescape(filename)
  61. catch /^Vim\%((\a\+)\)\=:E749/
  62. endtry
  63. endfunction"}}}
  64. function! neosnippet#commands#_make_cache(filetype) abort "{{{
  65. call neosnippet#init#check()
  66. let filetype = a:filetype == '' ?
  67. \ &filetype : a:filetype
  68. if filetype ==# ''
  69. let filetype = 'nothing'
  70. endif
  71. let snippets = neosnippet#variables#snippets()
  72. if has_key(snippets, filetype)
  73. return
  74. endif
  75. let snippets[filetype] = {}
  76. let path = join(neosnippet#helpers#get_snippets_directory(), ',')
  77. let cache_dir = neosnippet#variables#data_dir()
  78. for filename in s:get_snippets_files(path, filetype)
  79. " Clear cache file
  80. call s:Cache.deletefile(cache_dir, filename)
  81. let snippets[filetype] = extend(snippets[filetype],
  82. \ neosnippet#parser#_parse_snippets(filename))
  83. endfor
  84. if g:neosnippet#enable_snipmate_compatibility
  85. " Load file snippets
  86. for filename in s:get_snippet_files(path, filetype)
  87. let trigger = fnamemodify(filename, ':t:r')
  88. let snippets[filetype][trigger] =
  89. \ neosnippet#parser#_parse_snippet(filename, trigger)
  90. endfor
  91. endif
  92. endfunction"}}}
  93. function! neosnippet#commands#_source(filename) abort "{{{
  94. call neosnippet#init#check()
  95. let neosnippet = neosnippet#variables#current_neosnippet()
  96. let neosnippet.snippets = extend(neosnippet.snippets,
  97. \ neosnippet#parser#_parse_snippets(a:filename))
  98. endfunction"}}}
  99. function! neosnippet#commands#_clear_markers() abort "{{{
  100. let expand_stack = neosnippet#variables#expand_stack()
  101. " Get patterns and count.
  102. if !&l:modifiable || !&l:modified
  103. \ || empty(expand_stack)
  104. \ || neosnippet#variables#current_neosnippet().trigger
  105. return
  106. endif
  107. call neosnippet#view#_clear_markers(expand_stack[-1])
  108. endfunction"}}}
  109. " Complete helpers.
  110. function! neosnippet#commands#_edit_complete(arglead, cmdline, cursorpos) abort "{{{
  111. return filter(s:edit_options +
  112. \ neosnippet#commands#_filetype_complete(a:arglead, a:cmdline, a:cursorpos),
  113. \ 'stridx(v:val, a:arglead) == 0')
  114. endfunction"}}}
  115. function! neosnippet#commands#_filetype_complete(arglead, cmdline, cursorpos) abort "{{{
  116. " Dup check.
  117. let ret = {}
  118. for item in map(
  119. \ split(globpath(&runtimepath, 'syntax/*.vim'), '\n') +
  120. \ split(globpath(&runtimepath, 'indent/*.vim'), '\n') +
  121. \ split(globpath(&runtimepath, 'ftplugin/*.vim'), '\n')
  122. \ , 'fnamemodify(v:val, ":t:r")')
  123. if !has_key(ret, item) && item =~ '^'.a:arglead
  124. let ret[item] = 1
  125. endif
  126. endfor
  127. return sort(keys(ret))
  128. endfunction"}}}
  129. function! neosnippet#commands#_complete_target_snippets(arglead, cmdline, cursorpos) abort "{{{
  130. return map(filter(values(neosnippet#helpers#get_snippets()),
  131. \ "stridx(v:val.word, a:arglead) == 0
  132. \ && v:val.snip =~# neosnippet#get_placeholder_target_marker_pattern()"), 'v:val.word')
  133. endfunction"}}}
  134. function! s:initialize_options(options) abort "{{{
  135. let default_options = {
  136. \ 'runtime' : 0,
  137. \ 'vertical' : 0,
  138. \ 'direction' : 'below',
  139. \ 'split' : 0,
  140. \ }
  141. let options = extend(default_options, a:options)
  142. " Complex initializer.
  143. if has_key(options, 'horizontal')
  144. " Disable vertically.
  145. let options.vertical = 0
  146. endif
  147. return options
  148. endfunction"}}}
  149. function! s:get_snippets_files(path, filetype) abort "{{{
  150. let snippets_files = []
  151. for glob in s:get_list().flatten(
  152. \ map(split(get(g:neosnippet#scope_aliases,
  153. \ a:filetype, a:filetype), '\s*,\s*'), "
  154. \ [v:val.'.snip', v:val.'.snippets',
  155. \ v:val.'/**/*.snip', v:val.'/**/*.snippets']
  156. \ + (a:filetype != '_' &&
  157. \ !has_key(g:neosnippet#scope_aliases, a:filetype) ?
  158. \ [v:val . '_*.snip', v:val . '_*.snippets'] : [])"))
  159. let snippets_files += split(globpath(a:path, glob), '\n')
  160. endfor
  161. return reverse(s:get_list().uniq(snippets_files))
  162. endfunction"}}}
  163. function! s:get_snippet_files(path, filetype) abort "{{{
  164. let snippet_files = []
  165. for glob in s:get_list().flatten(
  166. \ map(split(get(g:neosnippet#scope_aliases,
  167. \ a:filetype, a:filetype), '\s*,\s*'), "
  168. \ [v:val.'/*.snippet']"))
  169. let snippet_files += split(globpath(a:path, glob), '\n')
  170. endfor
  171. return reverse(s:get_list().uniq(snippet_files))
  172. endfunction"}}}
  173. let &cpo = s:save_cpo
  174. unlet s:save_cpo
  175. " vim: foldmethod=marker