neocomplete.vim 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. "=============================================================================
  2. " FILE: neocomplete.vim
  3. " AUTHOR: Shougo Matsushita <Shougo.Matsu@gmail.com>
  4. " License: MIT license {{{
  5. " Permission is hereby granted, free of charge, to any person obtaining
  6. " a copy of this software and associated documentation files (the
  7. " "Software"), to deal in the Software without restriction, including
  8. " without limitation the rights to use, copy, modify, merge, publish,
  9. " distribute, sublicense, and/or sell copies of the Software, and to
  10. " permit persons to whom the Software is furnished to do so, subject to
  11. " the following conditions:
  12. "
  13. " The above copyright notice and this permission notice shall be included
  14. " in all copies or substantial portions of the Software.
  15. "
  16. " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17. " OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  18. " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  19. " IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  20. " CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  21. " TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  22. " SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23. " }}}
  24. "=============================================================================
  25. if !exists('g:loaded_neocomplete')
  26. runtime! plugin/neocomplete.vim
  27. endif
  28. let s:save_cpo = &cpo
  29. set cpo&vim
  30. " Global options definition. "{{{
  31. let g:neocomplete#max_list =
  32. \ get(g:, 'neocomplete#max_list', 100)
  33. let g:neocomplete#max_keyword_width =
  34. \ get(g:, 'neocomplete#max_keyword_width', 80)
  35. let g:neocomplete#auto_completion_start_length =
  36. \ get(g:, 'neocomplete#auto_completion_start_length', 2)
  37. let g:neocomplete#manual_completion_start_length =
  38. \ get(g:, 'neocomplete#manual_completion_start_length', 0)
  39. let g:neocomplete#min_keyword_length =
  40. \ get(g:, 'neocomplete#min_keyword_length', 4)
  41. let g:neocomplete#enable_ignore_case =
  42. \ get(g:, 'neocomplete#enable_ignore_case', &ignorecase)
  43. let g:neocomplete#enable_smart_case =
  44. \ get(g:, 'neocomplete#enable_smart_case', &infercase)
  45. let g:neocomplete#enable_camel_case =
  46. \ get(g:, 'neocomplete#enable_camel_case', 0)
  47. let g:neocomplete#disable_auto_complete =
  48. \ get(g:, 'neocomplete#disable_auto_complete', 0)
  49. let g:neocomplete#enable_fuzzy_completion =
  50. \ get(g:, 'neocomplete#enable_fuzzy_completion', 1)
  51. let g:neocomplete#auto_complete_delay =
  52. \ get(g:, 'neocomplete#auto_complete_delay', 50)
  53. let g:neocomplete#enable_auto_select =
  54. \ get(g:, 'neocomplete#enable_auto_select', 0)
  55. let g:neocomplete#enable_auto_delimiter =
  56. \ get(g:, 'neocomplete#enable_auto_delimiter', 0)
  57. let g:neocomplete#lock_buffer_name_pattern =
  58. \ get(g:, 'neocomplete#lock_buffer_name_pattern', '')
  59. let g:neocomplete#lock_iminsert =
  60. \ get(g:, 'neocomplete#lock_iminsert', 0)
  61. let g:neocomplete#enable_multibyte_completion =
  62. \ get(g:, 'neocomplete#enable_multibyte_completion', 0)
  63. let g:neocomplete#release_cache_time =
  64. \ get(g:, 'neocomplete#release_cache_time', 900)
  65. let g:neocomplete#skip_auto_completion_time =
  66. \ get(g:, 'neocomplete#skip_auto_completion_time', '0.3')
  67. let g:neocomplete#enable_auto_close_preview =
  68. \ get(g:, 'neocomplete#enable_auto_close_preview', 0)
  69. let g:neocomplete#enable_refresh_always =
  70. \ get(g:, 'neocomplete#enable_refresh_always', 0)
  71. let g:neocomplete#fallback_mappings =
  72. \ get(g:, 'neocomplete#fallback_mappings', [])
  73. let g:neocomplete#sources =
  74. \ get(g:, 'neocomplete#sources', {})
  75. let g:neocomplete#keyword_patterns =
  76. \ get(g:, 'neocomplete#keyword_patterns', {})
  77. let g:neocomplete#delimiter_patterns =
  78. \ get(g:, 'neocomplete#delimiter_patterns', {})
  79. let g:neocomplete#text_mode_filetypes =
  80. \ get(g:, 'neocomplete#text_mode_filetypes', {})
  81. let g:neocomplete#tags_filter_patterns =
  82. \ get(g:, 'neocomplete#tags_filter_patterns', {})
  83. let g:neocomplete#force_omni_input_patterns =
  84. \ get(g:, 'neocomplete#force_omni_input_patterns', {})
  85. let g:neocomplete#ignore_source_files =
  86. \ get(g:, 'neocomplete#ignore_source_files', [])
  87. "}}}
  88. function! neocomplete#initialize() abort "{{{
  89. return neocomplete#init#enable()
  90. endfunction"}}}
  91. function! neocomplete#get_current_neocomplete() abort "{{{
  92. if !exists('b:neocomplete')
  93. call neocomplete#init#_current_neocomplete()
  94. endif
  95. return b:neocomplete
  96. endfunction"}}}
  97. function! neocomplete#get_context() abort "{{{
  98. return neocomplete#get_current_neocomplete().context
  99. endfunction"}}}
  100. " Source helper. "{{{
  101. function! neocomplete#define_source(source) abort "{{{
  102. let sources = neocomplete#variables#get_sources()
  103. for source in neocomplete#util#convert2list(a:source)
  104. let source = neocomplete#init#_source(source)
  105. if !source.disabled
  106. let sources[source.name] = source
  107. endif
  108. endfor
  109. endfunction"}}}
  110. function! neocomplete#define_filter(filter) abort "{{{
  111. let filters = neocomplete#variables#get_filters()
  112. for filter in neocomplete#util#convert2list(a:filter)
  113. let filters[filter.name] = neocomplete#init#_filter(filter)
  114. endfor
  115. endfunction"}}}
  116. function! neocomplete#available_sources() abort "{{{
  117. return copy(neocomplete#variables#get_sources())
  118. endfunction"}}}
  119. function! neocomplete#custom_source(source_name, option_name, value) abort "{{{
  120. return neocomplete#custom#source(a:source_name, a:option_name, a:value)
  121. endfunction"}}}
  122. function! neocomplete#dup_filter(list) abort "{{{
  123. return neocomplete#util#dup_filter(a:list)
  124. endfunction"}}}
  125. function! neocomplete#system(...) abort "{{{
  126. return call('neocomplete#util#system', a:000)
  127. endfunction"}}}
  128. function! neocomplete#has_vimproc() abort "{{{
  129. return neocomplete#util#has_vimproc()
  130. endfunction"}}}
  131. function! neocomplete#get_cur_text(...) abort "{{{
  132. " Return cached text.
  133. let neocomplete = neocomplete#get_current_neocomplete()
  134. return (a:0 == 0 && mode() ==# 'i' &&
  135. \ neocomplete.cur_text != '') ?
  136. \ neocomplete.cur_text : neocomplete#helper#get_cur_text()
  137. endfunction"}}}
  138. function! neocomplete#get_keyword_pattern(...) abort "{{{
  139. let filetype = a:0 != 0? a:1 : neocomplete#get_context_filetype()
  140. if a:0 < 2
  141. return neocomplete#helper#unite_patterns(
  142. \ g:neocomplete#keyword_patterns, filetype)
  143. endif
  144. let source = neocomplete#variables#get_source(a:2)
  145. if !has_key(source, 'neocomplete__keyword_patterns')
  146. let source.neocomplete__keyword_patterns = {}
  147. endif
  148. if !has_key(source.neocomplete__keyword_patterns, filetype)
  149. let source.neocomplete__keyword_patterns[filetype] =
  150. \ neocomplete#helper#unite_patterns(
  151. \ source.keyword_patterns, filetype)
  152. endif
  153. return source.neocomplete__keyword_patterns[filetype]
  154. endfunction"}}}
  155. function! neocomplete#get_keyword_pattern_end(...) abort "{{{
  156. return '\%('.call('neocomplete#get_keyword_pattern', a:000).'\m\)$'
  157. endfunction"}}}
  158. function! neocomplete#match_word(...) abort "{{{
  159. return call('neocomplete#helper#match_word', a:000)
  160. endfunction"}}}
  161. function! neocomplete#is_enabled() abort "{{{
  162. return neocomplete#init#is_enabled()
  163. endfunction"}}}
  164. function! neocomplete#is_locked(...) abort "{{{
  165. return neocomplete#is_cache_disabled() || &paste
  166. \ || (&t_Co != '' && &t_Co < 8)
  167. \ || g:neocomplete#disable_auto_complete
  168. endfunction"}}}
  169. function! neocomplete#is_cache_disabled() abort "{{{
  170. let ignore_filetypes = ['fuf', 'ku']
  171. let bufnr = a:0 > 0 ? a:1 : bufnr('%')
  172. return !neocomplete#is_enabled()
  173. \ || index(ignore_filetypes, &filetype) >= 0
  174. \ || neocomplete#get_current_neocomplete().lock
  175. \ || (g:neocomplete#lock_buffer_name_pattern != '' &&
  176. \ bufname(bufnr) =~ g:neocomplete#lock_buffer_name_pattern)
  177. endfunction"}}}
  178. function! neocomplete#is_auto_select() abort "{{{
  179. return g:neocomplete#enable_auto_select
  180. endfunction"}}}
  181. function! neocomplete#is_auto_complete() abort "{{{
  182. let neocomplete = neocomplete#get_current_neocomplete()
  183. return neocomplete.is_auto_complete
  184. endfunction"}}}
  185. function! neocomplete#is_eskk_enabled() abort "{{{
  186. return exists('*eskk#is_enabled') && eskk#is_enabled()
  187. endfunction"}}}
  188. function! neocomplete#is_multibyte_input(cur_text) abort "{{{
  189. return (exists('b:skk_on') && b:skk_on)
  190. \ || (!g:neocomplete#enable_multibyte_completion
  191. \ && char2nr(split(a:cur_text, '\zs')[-1]) > 0x80)
  192. endfunction"}}}
  193. function! neocomplete#is_text_mode() abort "{{{
  194. let neocomplete = neocomplete#get_current_neocomplete()
  195. let filetypes = g:neocomplete#text_mode_filetypes
  196. return get(filetypes, neocomplete.context_filetype, 0)
  197. \ || get(filetypes, '_', 0)
  198. endfunction"}}}
  199. function! neocomplete#is_windows() abort "{{{
  200. return neocomplete#util#is_windows()
  201. endfunction"}}}
  202. function! neocomplete#is_prefetch() abort "{{{
  203. return 1
  204. endfunction"}}}
  205. function! neocomplete#exists_echodoc() abort "{{{
  206. return exists('g:loaded_echodoc') && g:loaded_echodoc
  207. endfunction"}}}
  208. function! neocomplete#within_comment() abort "{{{
  209. return neocomplete#get_current_neocomplete().within_comment
  210. endfunction"}}}
  211. function! neocomplete#print_error(string) abort "{{{
  212. echohl Error | echomsg '[neocomplete] ' . a:string | echohl None
  213. endfunction"}}}
  214. function! neocomplete#print_warning(string) abort "{{{
  215. echohl WarningMsg | echomsg '[neocomplete] ' . a:string | echohl None
  216. endfunction"}}}
  217. function! neocomplete#head_match(checkstr, headstr) abort "{{{
  218. let checkstr = &ignorecase ?
  219. \ tolower(a:checkstr) : a:checkstr
  220. let headstr = &ignorecase ?
  221. \ tolower(a:headstr) : a:headstr
  222. return stridx(checkstr, headstr) == 0
  223. endfunction"}}}
  224. function! neocomplete#get_source_filetypes(filetype) abort "{{{
  225. return neocomplete#helper#get_source_filetypes(a:filetype)
  226. endfunction"}}}
  227. function! neocomplete#escape_match(str) abort "{{{
  228. return escape(a:str, '~"*\.^$[]')
  229. endfunction"}}}
  230. function! neocomplete#get_context_filetype(...) abort "{{{
  231. let neocomplete = exists('b:neocomplete') ?
  232. \ b:neocomplete : neocomplete#get_current_neocomplete()
  233. if a:0 != 0 || mode() !=# 'i' ||
  234. \ neocomplete.context_filetype == ''
  235. call neocomplete#context_filetype#set()
  236. endif
  237. return neocomplete.context_filetype
  238. endfunction"}}}
  239. function! neocomplete#print_debug(expr) abort "{{{
  240. if g:neocomplete#enable_debug
  241. echomsg string(a:expr)
  242. endif
  243. endfunction"}}}
  244. function! neocomplete#get_data_directory() abort "{{{
  245. let g:neocomplete#data_directory =
  246. \ get(g:, 'neocomplete#data_directory',
  247. \ ($XDG_CACHE_HOME != '' ?
  248. \ $XDG_CACHE_HOME . '/neocomplete' : '~/.cache/neocomplete'))
  249. let directory = neocomplete#util#substitute_path_separator(
  250. \ neocomplete#util#expand(g:neocomplete#data_directory))
  251. if !isdirectory(directory)
  252. if neocomplete#util#is_sudo()
  253. call neocomplete#print_error(printf(
  254. \ 'Cannot create Directory "%s" in sudo session.', directory))
  255. else
  256. call mkdir(directory, 'p')
  257. endif
  258. endif
  259. return directory
  260. endfunction"}}}
  261. function! neocomplete#complete_check() abort "{{{
  262. return neocomplete#helper#complete_check()
  263. endfunction"}}}
  264. function! neocomplete#skip_next_complete() abort "{{{
  265. let neocomplete = neocomplete#get_current_neocomplete()
  266. let neocomplete.skip_next_complete = 1
  267. endfunction"}}}
  268. function! neocomplete#get_default_matchers() abort "{{{
  269. return map(copy(neocomplete#get_current_neocomplete().default_matchers),
  270. \ 'v:val.name')
  271. endfunction"}}}
  272. function! neocomplete#set_default_matchers(matchers) abort "{{{
  273. let neocomplete = neocomplete#get_current_neocomplete()
  274. let neocomplete.default_matchers = neocomplete#init#_filters(
  275. \ neocomplete#util#convert2list(a:matchers))
  276. endfunction"}}}
  277. function! neocomplete#set_dictionary_helper(variable, keys, value) abort "{{{
  278. return neocomplete#util#set_dictionary_helper(
  279. \ a:variable, a:keys, a:value)
  280. endfunction"}}}
  281. function! neocomplete#disable_default_dictionary(variable) abort "{{{
  282. return neocomplete#util#disable_default_dictionary(a:variable)
  283. endfunction"}}}
  284. function! neocomplete#filetype_complete(arglead, cmdline, cursorpos) abort "{{{
  285. return neocomplete#helper#filetype_complete(a:arglead, a:cmdline, a:cursorpos)
  286. endfunction"}}}
  287. "}}}
  288. " Key mapping functions. "{{{
  289. function! neocomplete#smart_close_popup() abort
  290. return neocomplete#mappings#smart_close_popup()
  291. endfunction
  292. function! neocomplete#close_popup() abort
  293. return neocomplete#mappings#close_popup()
  294. endfunction
  295. function! neocomplete#cancel_popup() abort
  296. return neocomplete#mappings#cancel_popup()
  297. endfunction
  298. function! neocomplete#undo_completion() abort
  299. return neocomplete#mappings#undo_completion()
  300. endfunction
  301. function! neocomplete#complete_common_string() abort
  302. return neocomplete#mappings#complete_common_string()
  303. endfunction
  304. function! neocomplete#start_manual_complete(...) abort
  305. return call('neocomplete#mappings#start_manual_complete', a:000)
  306. endfunction
  307. "}}}
  308. let &cpo = s:save_cpo
  309. unlet s:save_cpo
  310. " vim: foldmethod=marker