init.vim 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. "=============================================================================
  2. " FILE: init.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. let s:save_cpo = &cpo
  26. set cpo&vim
  27. if !exists('s:is_enabled')
  28. let s:is_enabled = 0
  29. endif
  30. function! neocomplete#init#enable() abort "{{{
  31. if neocomplete#is_enabled()
  32. return
  33. endif
  34. if !(has('lua') && (v:version > 703 || v:version == 703 && has('patch885')))
  35. echomsg 'neocomplete does not work with this version of Vim.'
  36. echomsg 'neocomplete requires Vim 7.3.885 or later with Lua support ("+lua").'
  37. return
  38. endif
  39. if !exists('b:neocomplete')
  40. call neocomplete#init#_current_neocomplete()
  41. endif
  42. call neocomplete#init#_autocmds()
  43. call neocomplete#init#_others()
  44. call neocomplete#init#_sources(get(g:neocomplete#sources,
  45. \ neocomplete#get_context_filetype(), ['_']))
  46. let s:is_enabled = 1
  47. doautocmd <nomodeline> neocomplete InsertEnter
  48. endfunction"}}}
  49. function! neocomplete#init#disable() abort "{{{
  50. if !neocomplete#is_enabled()
  51. return
  52. endif
  53. let s:is_enabled = 0
  54. augroup neocomplete
  55. autocmd!
  56. augroup END
  57. silent! delcommand NeoCompleteDisable
  58. call neocomplete#helper#call_hook(filter(values(
  59. \ neocomplete#variables#get_sources()), 'v:val.loaded'),
  60. \ 'on_final', {})
  61. endfunction"}}}
  62. function! neocomplete#init#is_enabled() abort "{{{
  63. return s:is_enabled
  64. endfunction"}}}
  65. function! neocomplete#init#_autocmds() abort "{{{
  66. augroup neocomplete
  67. autocmd!
  68. autocmd InsertEnter *
  69. \ call neocomplete#handler#_on_insert_enter()
  70. autocmd InsertLeave *
  71. \ call neocomplete#handler#_on_insert_leave()
  72. autocmd CursorMovedI *
  73. \ call neocomplete#handler#_on_moved_i()
  74. autocmd InsertCharPre *
  75. \ call neocomplete#handler#_on_insert_char_pre()
  76. autocmd TextChangedI *
  77. \ call neocomplete#handler#_on_text_changed()
  78. autocmd CompleteDone *
  79. \ call neocomplete#handler#_on_complete_done()
  80. augroup END
  81. let event = neocomplete#util#is_text_changed() ?
  82. \ 'TextChangedI' : 'CursorMovedI'
  83. execute 'autocmd neocomplete' event '*'
  84. \ 'call neocomplete#handler#_do_auto_complete("'.event.'")'
  85. autocmd neocomplete InsertEnter *
  86. \ call neocomplete#handler#_do_auto_complete('InsertEnter')
  87. endfunction"}}}
  88. function! neocomplete#init#_others() abort "{{{
  89. call neocomplete#init#_variables()
  90. call neocomplete#commands#_initialize()
  91. " For auto complete keymappings.
  92. call neocomplete#mappings#define_default_mappings()
  93. " Detect set paste.
  94. if &paste
  95. redir => output
  96. 99verbose set paste
  97. redir END
  98. call neocomplete#print_error(output)
  99. call neocomplete#print_error(
  100. \ 'Detected set paste! Disabled neocomplete.')
  101. endif
  102. " Detect poor color
  103. if &t_Co != '' && &t_Co < 8
  104. call neocomplete#print_error(
  105. \ 'Your terminal color is very limited. Disabled neocomplete.')
  106. endif
  107. command! -nargs=0 -bar NeoCompleteDisable
  108. \ call neocomplete#init#disable()
  109. endfunction"}}}
  110. function! neocomplete#init#_variables() abort "{{{
  111. " Initialize keyword patterns. "{{{
  112. call neocomplete#util#set_default_dictionary(
  113. \'g:neocomplete#keyword_patterns',
  114. \'_',
  115. \'\h\w*')
  116. call neocomplete#util#set_default_dictionary(
  117. \ 'g:neocomplete#keyword_patterns',
  118. \'filename',
  119. \ neocomplete#util#is_windows() ?
  120. \'\%(\a\+:/\)\?\%([/[:alnum:]()$+_~.{}\x80-\xff-]\|[^[:print:]]\|\\.\)\+' :
  121. \'\%([/\[\][:alnum:]()$+_~.{}-]\|[^[:print:]]\|\\.\)\+')
  122. call neocomplete#util#set_default_dictionary(
  123. \'g:neocomplete#keyword_patterns',
  124. \'lisp,scheme,clojure,int-gosh,int-clisp,int-clj',
  125. \'[[:alpha:]!$%&*+/:<=>?@\^_~\-][[:alnum:]!$%&*./:<=>?@\^_~\-]*')
  126. call neocomplete#util#set_default_dictionary(
  127. \'g:neocomplete#keyword_patterns',
  128. \'ruby,int-irb',
  129. \'^=\%(b\%[egin]\|e\%[nd]\)\|\%(@@\|[$@]\)\h\w*\|\h\w*[!?]\?')
  130. call neocomplete#util#set_default_dictionary(
  131. \'g:neocomplete#keyword_patterns',
  132. \'php,int-php',
  133. \'</\?\%(\h[[:alnum:]_-]*\s*\)\?\%(/\?>\)\?\|\$\h\w*\|\h\w*')
  134. call neocomplete#util#set_default_dictionary(
  135. \'g:neocomplete#keyword_patterns',
  136. \'perl,int-perlsh',
  137. \'<\h\w*>\?\|[$@%&*]\h\w*\|\h\w*')
  138. call neocomplete#util#set_default_dictionary(
  139. \'g:neocomplete#keyword_patterns',
  140. \'perl6,int-perl6',
  141. \'<\h\w*>\?\|[$@%&][!.*?]\?\h[[:alnum:]_-]*\|\h[[:alnum:]_-]*')
  142. call neocomplete#util#set_default_dictionary(
  143. \'g:neocomplete#keyword_patterns',
  144. \'pir',
  145. \'[$@%.=]\?\h\w*')
  146. call neocomplete#util#set_default_dictionary(
  147. \'g:neocomplete#keyword_patterns',
  148. \'pasm',
  149. \'[=]\?\h\w*')
  150. call neocomplete#util#set_default_dictionary(
  151. \'g:neocomplete#keyword_patterns',
  152. \'vim,help',
  153. \'-\h[[:alnum:]-]*=\?\|\c\[:\%(\h\w*:\]\)\?\|&\h[[:alnum:]_:]*\|'.
  154. \'<SID>\%(\h\w*\)\?\|<Plug>([^)]*)\?'.
  155. \'\|<\h[[:alnum:]_-]*>\?\|\h[[:alnum:]_:#]*[!(]\?\|$\h\w*')
  156. call neocomplete#util#set_default_dictionary(
  157. \'g:neocomplete#keyword_patterns',
  158. \'tex',
  159. \'\\\a{\a\{1,2}}\|\\[[:alpha:]@][[:alnum:]@]*'.
  160. \'\%({\%([[:alnum:]:_]\+\*\?}\?\)\?\)\?\|\a[[:alnum:]:_]*\*\?')
  161. call neocomplete#util#set_default_dictionary(
  162. \'g:neocomplete#keyword_patterns',
  163. \'sh,zsh,int-zsh,int-bash,int-sh',
  164. \'[[:alpha:]_.-][[:alnum:]_.-]*')
  165. call neocomplete#util#set_default_dictionary(
  166. \'g:neocomplete#keyword_patterns',
  167. \'vimshell',
  168. \'\$\$\?\w*\|[[:alpha:]_.\\/~-][[:alnum:]_.\\/~-]*\|\d\+\%(\.\d\+\)\+')
  169. call neocomplete#util#set_default_dictionary(
  170. \'g:neocomplete#keyword_patterns',
  171. \'ps1,int-powershell',
  172. \'\[\h\%([[:alnum:]_.]*\]::\)\?\|[$%@.]\?[[:alpha:]_.:-][[:alnum:]_.:-]*')
  173. call neocomplete#util#set_default_dictionary(
  174. \'g:neocomplete#keyword_patterns',
  175. \'c',
  176. \'^\s*#\s*\h\w*\|\h\w*')
  177. call neocomplete#util#set_default_dictionary(
  178. \'g:neocomplete#keyword_patterns',
  179. \'cpp',
  180. \'^\s*#\s*\h\w*\|\h\w*')
  181. call neocomplete#util#set_default_dictionary(
  182. \'g:neocomplete#keyword_patterns',
  183. \'objc',
  184. \'^\s*#\s*\h\w*\|\h\w*\|@\h\w*')
  185. call neocomplete#util#set_default_dictionary(
  186. \'g:neocomplete#keyword_patterns',
  187. \'objcpp',
  188. \'^\s*#\s*\h\w*\|\h\w*\|@\h\w*')
  189. call neocomplete#util#set_default_dictionary(
  190. \'g:neocomplete#keyword_patterns',
  191. \'objj',
  192. \'\h\w*\|@\h\w*')
  193. call neocomplete#util#set_default_dictionary(
  194. \'g:neocomplete#keyword_patterns',
  195. \'d',
  196. \'\h\w*')
  197. call neocomplete#util#set_default_dictionary(
  198. \'g:neocomplete#keyword_patterns',
  199. \'python,int-python,int-ipython',
  200. \'[@]\?\h\w*')
  201. call neocomplete#util#set_default_dictionary(
  202. \'g:neocomplete#keyword_patterns',
  203. \'cs',
  204. \'\h\w*')
  205. call neocomplete#util#set_default_dictionary(
  206. \'g:neocomplete#keyword_patterns',
  207. \'java',
  208. \'[@]\?\h\w*')
  209. call neocomplete#util#set_default_dictionary(
  210. \'g:neocomplete#keyword_patterns',
  211. \'javascript,actionscript,int-js,int-kjs,int-rhino',
  212. \'\h\w*')
  213. call neocomplete#util#set_default_dictionary(
  214. \'g:neocomplete#keyword_patterns',
  215. \'coffee,int-coffee',
  216. \'[@]\?\h\w*')
  217. call neocomplete#util#set_default_dictionary(
  218. \'g:neocomplete#keyword_patterns',
  219. \'awk',
  220. \'\h\w*')
  221. call neocomplete#util#set_default_dictionary(
  222. \'g:neocomplete#keyword_patterns',
  223. \'haskell,int-ghci',
  224. \'\%(\u\w*\.\)\+[[:alnum:]_'']*\|[[:alpha:]_''][[:alnum:]_'']*')
  225. call neocomplete#util#set_default_dictionary(
  226. \'g:neocomplete#keyword_patterns',
  227. \'ml,ocaml,int-ocaml,int-sml,int-smlsharp',
  228. \'[''`#.]\?\h[[:alnum:]_'']*')
  229. call neocomplete#util#set_default_dictionary(
  230. \'g:neocomplete#keyword_patterns',
  231. \'erlang,int-erl',
  232. \'^\s*-\h\w*\|\%(\h\w*:\)*\h\w*\|\h[[:alnum:]_@]*')
  233. call neocomplete#util#set_default_dictionary(
  234. \'g:neocomplete#keyword_patterns',
  235. \'html,xhtml,xml,markdown,mkd,eruby',
  236. \'</\?\%([[:alnum:]_:-]\+\s*\)\?\%(/\?>\)\?\|&\h\%(\w*;\)\?'.
  237. \'\|\h[[:alnum:]_-]*="\%([^"]*"\?\)\?\|\h[[:alnum:]_:-]*')
  238. call neocomplete#util#set_default_dictionary(
  239. \'g:neocomplete#keyword_patterns',
  240. \'css,stylus,scss,less',
  241. \'[@#.]\?[[:alpha:]_-][[:alnum:]_-]*')
  242. call neocomplete#util#set_default_dictionary(
  243. \'g:neocomplete#keyword_patterns',
  244. \'tags',
  245. \'^[^!][^/[:blank:]]*')
  246. call neocomplete#util#set_default_dictionary(
  247. \'g:neocomplete#keyword_patterns',
  248. \'pic',
  249. \'^\s*#\h\w*\|\h\w*')
  250. call neocomplete#util#set_default_dictionary(
  251. \'g:neocomplete#keyword_patterns',
  252. \'arm',
  253. \'\h\w*')
  254. call neocomplete#util#set_default_dictionary(
  255. \'g:neocomplete#keyword_patterns',
  256. \'asmh8300',
  257. \'[[:alpha:]_.][[:alnum:]_.]*')
  258. call neocomplete#util#set_default_dictionary(
  259. \'g:neocomplete#keyword_patterns',
  260. \'masm',
  261. \'\.\h\w*\|[[:alpha:]_@?$][[:alnum:]_@?$]*\|\h\w*:\h\w*')
  262. call neocomplete#util#set_default_dictionary(
  263. \'g:neocomplete#keyword_patterns',
  264. \'nasm',
  265. \'^\s*\[\h\w*\|[%.]\?\h\w*\|\%(\.\.@\?\|%[%$!]\)\%(\h\w*\)\?\|\h\w*:\h\w*')
  266. call neocomplete#util#set_default_dictionary(
  267. \'g:neocomplete#keyword_patterns',
  268. \'asm',
  269. \'[%$.]\?\h\w*\%(\$\h\w*\)\?')
  270. call neocomplete#util#set_default_dictionary(
  271. \'g:neocomplete#keyword_patterns',
  272. \'gas',
  273. \'[$.]\?\h\w*')
  274. call neocomplete#util#set_default_dictionary(
  275. \'g:neocomplete#keyword_patterns',
  276. \'gdb,int-gdb',
  277. \'$\h\w*\|[[:alnum:]:._-]\+')
  278. call neocomplete#util#set_default_dictionary(
  279. \'g:neocomplete#keyword_patterns',
  280. \'make',
  281. \'[[:alpha:]_.-][[:alnum:]_.-]*')
  282. call neocomplete#util#set_default_dictionary(
  283. \'g:neocomplete#keyword_patterns',
  284. \'scala,int-scala',
  285. \'\h\w*')
  286. call neocomplete#util#set_default_dictionary(
  287. \'g:neocomplete#keyword_patterns',
  288. \'int-termtter',
  289. \'\h[[:alnum:]_/-]*\|\$\a\+\|#\h\w*')
  290. call neocomplete#util#set_default_dictionary(
  291. \'g:neocomplete#keyword_patterns',
  292. \'int-earthquake',
  293. \'[:#$]\h\w*\|\h[[:alnum:]_/-]*')
  294. call neocomplete#util#set_default_dictionary(
  295. \'g:neocomplete#keyword_patterns',
  296. \'dosbatch,int-cmdproxy',
  297. \'\$\w+\|[[:alpha:]_./-][[:alnum:]_.-]*')
  298. call neocomplete#util#set_default_dictionary(
  299. \'g:neocomplete#keyword_patterns',
  300. \'vb',
  301. \'\h\w*\|#\h\w*')
  302. call neocomplete#util#set_default_dictionary(
  303. \'g:neocomplete#keyword_patterns',
  304. \'lua',
  305. \'\h\w*')
  306. call neocomplete#util#set_default_dictionary(
  307. \'g:neocomplete#keyword_patterns',
  308. \ 'zimbu',
  309. \'\h\w*')
  310. call neocomplete#util#set_default_dictionary(
  311. \'g:neocomplete#keyword_patterns',
  312. \'konoha',
  313. \'[*$@%]\h\w*\|\h\w*')
  314. call neocomplete#util#set_default_dictionary(
  315. \'g:neocomplete#keyword_patterns',
  316. \'cobol',
  317. \'\a[[:alnum:]-]*')
  318. call neocomplete#util#set_default_dictionary(
  319. \'g:neocomplete#keyword_patterns',
  320. \'coq',
  321. \'\h[[:alnum:]_'']*')
  322. call neocomplete#util#set_default_dictionary(
  323. \'g:neocomplete#keyword_patterns',
  324. \'tcl',
  325. \'[.-]\h\w*\|\h\w*')
  326. call neocomplete#util#set_default_dictionary(
  327. \'g:neocomplete#keyword_patterns',
  328. \'nyaos,int-nyaos',
  329. \'\h\w*')
  330. call neocomplete#util#set_default_dictionary(
  331. \'g:neocomplete#keyword_patterns',
  332. \'go',
  333. \'\h\w*')
  334. call neocomplete#util#set_default_dictionary(
  335. \'g:neocomplete#keyword_patterns',
  336. \'toml',
  337. \'\h[[:alnum:]_.-]*')
  338. "}}}
  339. " Initialize delimiter patterns. "{{{
  340. call neocomplete#util#set_default_dictionary(
  341. \ 'g:neocomplete#delimiter_patterns',
  342. \ 'vim,help', ['#'])
  343. call neocomplete#util#set_default_dictionary(
  344. \ 'g:neocomplete#delimiter_patterns',
  345. \ 'erlang,lisp,int-clisp', [':'])
  346. call neocomplete#util#set_default_dictionary(
  347. \ 'g:neocomplete#delimiter_patterns',
  348. \ 'lisp,int-clisp', ['/', ':'])
  349. call neocomplete#util#set_default_dictionary(
  350. \ 'g:neocomplete#delimiter_patterns',
  351. \ 'clojure,int-clj', ['/', '.'])
  352. call neocomplete#util#set_default_dictionary(
  353. \ 'g:neocomplete#delimiter_patterns',
  354. \ 'perl,cpp', ['::'])
  355. call neocomplete#util#set_default_dictionary(
  356. \ 'g:neocomplete#delimiter_patterns',
  357. \ 'php', ['\', '::'])
  358. call neocomplete#util#set_default_dictionary(
  359. \ 'g:neocomplete#delimiter_patterns',
  360. \ 'java,d,javascript,actionscript,'.
  361. \ 'ruby,eruby,haskell,int-ghci,coffee,zimbu,konoha',
  362. \ ['.'])
  363. call neocomplete#util#set_default_dictionary(
  364. \ 'g:neocomplete#delimiter_patterns',
  365. \ 'lua', ['.', ':'])
  366. call neocomplete#util#set_default_dictionary(
  367. \ 'g:neocomplete#delimiter_patterns',
  368. \ 'perl6', ['.', '::'])
  369. "}}}
  370. " Initialize text mode filetypes. "{{{
  371. call neocomplete#util#set_default_dictionary(
  372. \ 'g:neocomplete#text_mode_filetypes',
  373. \ join(['hybrid', 'text', 'help', 'tex', 'gitcommit', 'gitrebase',
  374. \ 'vcs-commit', 'markdown', 'mkd', 'textile', 'creole',
  375. \ 'org', 'rdoc', 'mediawiki', 'rst', 'asciidoc', 'pod',
  376. \ 'gita-commit', 'J6uil_say',
  377. \ ], ','), 1)
  378. "}}}
  379. " Initialize tags filter patterns. "{{{
  380. call neocomplete#util#set_default_dictionary(
  381. \'g:neocomplete#tags_filter_patterns', 'c,cpp',
  382. \'v:val.word !~ ''^[~_]''')
  383. "}}}
  384. " Initialize force omni completion patterns. "{{{
  385. call neocomplete#util#set_default_dictionary(
  386. \'g:neocomplete#force_omni_input_patterns', 'objc',
  387. \'\h\w\+\|[^.[:digit:] *\t]\%(\.\|->\)')
  388. "}}}
  389. " Must g:neocomplete#auto_completion_start_length > 1.
  390. if g:neocomplete#auto_completion_start_length < 1
  391. let g:neocomplete#auto_completion_start_length = 1
  392. endif
  393. " Must g:neocomplete#min_keyword_length > 1.
  394. if g:neocomplete#min_keyword_length < 1
  395. let g:neocomplete#min_keyword_length = 1
  396. endif
  397. endfunction"}}}
  398. function! neocomplete#init#_current_neocomplete() abort "{{{
  399. let b:neocomplete = {
  400. \ 'context' : {
  401. \ 'input' : '',
  402. \ 'complete_pos' : -1,
  403. \ 'complete_str' : '',
  404. \ 'candidates' : [],
  405. \ },
  406. \ 'lock' : 0,
  407. \ 'skip_next_complete' : 0,
  408. \ 'filetype' : '',
  409. \ 'context_filetype' : '',
  410. \ 'context_filetypes' : [],
  411. \ 'completion_length' : -1,
  412. \ 'foldinfo' : [],
  413. \ 'skipped' : 0,
  414. \ 'event' : '',
  415. \ 'cur_text' : '',
  416. \ 'old_cur_text' : '',
  417. \ 'old_linenr' : line('.'),
  418. \ 'old_complete_pos' : -1,
  419. \ 'old_char' : '',
  420. \ 'complete_str' : '',
  421. \ 'complete_pos' : -1,
  422. \ 'candidates' : [],
  423. \ 'complete_sources' : [],
  424. \ 'manual_sources' : [],
  425. \ 'start_time' : reltime(),
  426. \ 'linenr' : 0,
  427. \ 'completeopt' : &completeopt,
  428. \ 'sources' : [],
  429. \ 'sources_filetype' : '',
  430. \ 'within_comment' : 0,
  431. \ 'is_auto_complete' : 0,
  432. \ 'indent_text' : '',
  433. \ 'detected_foldmethod' : 0,
  434. \ 'default_matchers' : neocomplete#init#_filters(
  435. \ (g:neocomplete#enable_fuzzy_completion ?
  436. \ ['matcher_fuzzy'] : ['matcher_head'])
  437. \ + ['matcher_length']),
  438. \}
  439. endfunction"}}}
  440. function! neocomplete#init#_sources(names) abort "{{{
  441. if !exists('s:loaded_source_files')
  442. " Initialize.
  443. let s:loaded_source_files = {}
  444. let s:loaded_all_sources = 0
  445. let s:runtimepath_save = ''
  446. endif
  447. " Initialize sources table.
  448. if s:loaded_all_sources && &runtimepath ==# s:runtimepath_save
  449. return
  450. endif
  451. let runtimepath_save = neocomplete#util#split_rtp(s:runtimepath_save)
  452. let runtimepath = neocomplete#util#join_rtp(
  453. \ filter(neocomplete#util#split_rtp(),
  454. \ 'index(runtimepath_save, v:val) < 0'))
  455. let sources = neocomplete#variables#get_sources()
  456. for name in filter(copy(a:names), '!has_key(sources, v:val)')
  457. " Search autoload.
  458. for source_name in map(filter(split(globpath(runtimepath,
  459. \ 'autoload/neocomplete/sources/*.vim'), '\n'),
  460. \ "index(g:neocomplete#ignore_source_files,
  461. \ fnamemodify(v:val, ':t')) < 0"),
  462. \ "fnamemodify(v:val, ':t:r')")
  463. if has_key(s:loaded_source_files, source_name)
  464. continue
  465. endif
  466. let s:loaded_source_files[source_name] = 1
  467. let source = neocomplete#sources#{source_name}#define()
  468. if empty(source)
  469. " Ignore.
  470. continue
  471. endif
  472. call neocomplete#define_source(source)
  473. endfor
  474. if name == '_'
  475. let s:loaded_all_sources = 1
  476. let s:runtimepath_save = &runtimepath
  477. endif
  478. endfor
  479. endfunction"}}}
  480. function! neocomplete#init#_source(source) abort "{{{
  481. let default = {
  482. \ 'is_volatile' : 0,
  483. \ 'max_candidates' : 0,
  484. \ 'filetypes' : {},
  485. \ 'disabled' : 0,
  486. \ 'disabled_filetypes' : {},
  487. \ 'hooks' : {},
  488. \ 'matchers' : [],
  489. \ 'sorters' : ['sorter_rank'],
  490. \ 'converters' : [
  491. \ 'converter_remove_overlap',
  492. \ 'converter_abbr',
  493. \ ],
  494. \ 'keyword_patterns' : g:neocomplete#keyword_patterns,
  495. \ 'min_pattern_length' : g:neocomplete#auto_completion_start_length,
  496. \ 'input_pattern' : '',
  497. \ 'neocomplete__context' : neocomplete#init#_context({}),
  498. \ }
  499. let source = extend(copy(default), a:source)
  500. " Overwritten by user custom.
  501. let custom = neocomplete#custom#get().sources
  502. let source = extend(source, get(custom, source.name,
  503. \ get(custom, '_', {})))
  504. let source.loaded = 0
  505. " Source kind convertion.
  506. if !has_key(source, 'kind')
  507. let source.kind = 'manual'
  508. elseif source.kind ==# 'plugin'
  509. let source.kind = 'keyword'
  510. elseif source.kind ==# 'ftplugin' || source.kind ==# 'complfunc'
  511. " For compatibility.
  512. let source.kind = 'manual'
  513. endif
  514. if !has_key(source, 'rank')
  515. " Set default rank.
  516. let source.rank = (source.kind ==# 'keyword') ? 5 :
  517. \ empty(source.filetypes) ? 10 : 100
  518. endif
  519. if !has_key(source, 'mark')
  520. " Set default mark.
  521. let source.mark = '[' . source.name . ']'
  522. endif
  523. if !has_key(source.keyword_patterns, '_')
  524. " Set default keyword pattern.
  525. let source.keyword_patterns['_'] =
  526. \ get(g:neocomplete#keyword_patterns, '_', '\h\w*')
  527. endif
  528. let source.neocomplete__matchers = neocomplete#init#_filters(
  529. \ neocomplete#util#convert2list(source.matchers))
  530. let source.neocomplete__sorters = neocomplete#init#_filters(
  531. \ neocomplete#util#convert2list(source.sorters))
  532. let source.neocomplete__converters = neocomplete#init#_filters(
  533. \ neocomplete#util#convert2list(source.converters))
  534. let source.neocomplete__context.source_name = source.name
  535. return source
  536. endfunction"}}}
  537. function! neocomplete#init#_filters(names) abort "{{{
  538. let _ = []
  539. let filters = neocomplete#variables#get_filters()
  540. for name in a:names
  541. if !has_key(filters, name)
  542. " Search autoload.
  543. for filter_name in map(split(globpath(&runtimepath,
  544. \ 'autoload/neocomplete/filters/'.
  545. \ substitute(name,
  546. \'^\%(matcher\|sorter\|converter\)_[^/_-]\+\zs[/_-].*$', '', '')
  547. \ .'*.vim'), '\n'), "fnamemodify(v:val, ':t:r')")
  548. let filter = neocomplete#filters#{filter_name}#define()
  549. if empty(filter)
  550. " Ignore.
  551. continue
  552. endif
  553. call neocomplete#define_filter(filter)
  554. endfor
  555. if !has_key(filters, name)
  556. " Not found.
  557. call neocomplete#print_error(
  558. \ printf('filter name : %s is not found.', string(name)))
  559. continue
  560. endif
  561. endif
  562. if has_key(filters, name)
  563. call add(_, filters[name])
  564. endif
  565. endfor
  566. return _
  567. endfunction"}}}
  568. function! neocomplete#init#_filter(filter) abort "{{{
  569. let default = {
  570. \ }
  571. let filter = extend(default, a:filter)
  572. if !has_key(filter, 'kind')
  573. let filter.kind =
  574. \ (filter.name =~# '^matcher_') ? 'matcher' :
  575. \ (filter.name =~# '^sorter_') ? 'sorter' : 'converter'
  576. endif
  577. return filter
  578. endfunction"}}}
  579. function! neocomplete#init#_context(context) abort "{{{
  580. let filetype = neocomplete#get_context_filetype()
  581. return extend(a:context, {
  582. \ 'input' : '',
  583. \ 'prev_complete_pos' : -1,
  584. \ 'prev_candidates' : [],
  585. \ 'prev_line' : '',
  586. \ 'complete_pos' : -1,
  587. \ 'complete_str' : '',
  588. \ 'candidates' : [],
  589. \ 'filetype' : filetype,
  590. \ 'filetypes' : neocomplete#context_filetype#filetypes(),
  591. \ })
  592. endfunction"}}}
  593. let &cpo = s:save_cpo
  594. unlet s:save_cpo
  595. " vim: foldmethod=marker