"============================================================================= " FILE: init.vim " AUTHOR: Shougo Matsushita " License: MIT license "============================================================================= if !exists('s:is_enabled') let s:is_enabled = 0 endif let s:is_windows = ((has('win32') || has('win64')) ? v:true : v:false) function! deoplete#init#_is_enabled() abort return s:is_enabled endfunction function! deoplete#init#_initialize() abort if has('vim_starting') augroup deoplete autocmd! autocmd VimEnter * call deoplete#enable() augroup END return 1 endif if !deoplete#init#_check_channel() return 1 endif augroup deoplete autocmd! augroup END call deoplete#init#_variables() if deoplete#init#_channel() return 1 endif call deoplete#mapping#_init() endfunction function! deoplete#init#_channel() abort let python3 = get(g:, 'python3_host_prog', 'python3') if !executable(python3) call deoplete#util#print_error( \ string(python3) . ' is not executable.') call deoplete#util#print_error( \ 'You need to set g:python3_host_prog.') endif try if deoplete#util#has_yarp() let g:deoplete#_yarp = yarp#py3('deoplete') call g:deoplete#_yarp.notify('deoplete_init') else " rplugin.vim may not be loaded on VimEnter if !exists('g:loaded_remote_plugins') runtime! plugin/rplugin.vim endif call _deoplete_init() endif catch call deoplete#util#print_error(v:exception) call deoplete#util#print_error(v:throwpoint) if !has('python3') call deoplete#util#print_error( \ 'deoplete requires Python3 support("+python3").') endif if deoplete#util#has_yarp() if !has('nvim') && !exists('*neovim_rpc#serveraddr') call deoplete#util#print_error( \ 'deoplete requires vim-hug-neovim-rpc plugin in Vim.') endif if !exists('*yarp#py3') call deoplete#util#print_error( \ 'deoplete requires nvim-yarp plugin.') endif else call deoplete#util#print_error( \ 'deoplete failed to load. ' \ .'Try the :UpdateRemotePlugins command and restart Neovim. ' \ .'See also :checkhealth.') endif return 1 endtry endfunction function! deoplete#init#_check_channel() abort return !exists('g:deoplete#_initialized') endfunction function! deoplete#init#_enable() abort call deoplete#handler#_init() let s:is_enabled = 1 endfunction function! deoplete#init#_disable() abort augroup deoplete autocmd! augroup END let s:is_enabled = 0 endfunction function! deoplete#init#_variables() abort let g:deoplete#_prev_completion = { \ 'complete_position': [], \ 'candidates': [], \ 'event': '', \ } let g:deoplete#_context = {} let g:deoplete#_rank = {} if !exists('g:deoplete#_logging') let g:deoplete#_logging = {} endif unlet! g:deoplete#_initialized let g:deoplete#_serveraddr = has('nvim') ? \ v:servername : neovim_rpc#serveraddr() if g:deoplete#_serveraddr ==# '' " Use NVIM_LISTEN_ADDRESS let g:deoplete#_serveraddr = $NVIM_LISTEN_ADDRESS endif " User variables call deoplete#util#set_default( \ 'g:deoplete#enable_at_startup', 0) call deoplete#util#set_default( \ 'g:deoplete#enable_yarp', 0) call deoplete#util#set_default( \ 'g:deoplete#auto_complete_start_length', 2) call deoplete#util#set_default( \ 'g:deoplete#enable_ignore_case', &ignorecase) call deoplete#util#set_default( \ 'g:deoplete#enable_smart_case', &smartcase) call deoplete#util#set_default( \ 'g:deoplete#enable_camel_case', 0) call deoplete#util#set_default( \ 'g:deoplete#enable_refresh_always', 0) call deoplete#util#set_default( \ 'g:deoplete#enable_on_insert_enter', 1) call deoplete#util#set_default( \ 'g:deoplete#disable_auto_complete', 0) call deoplete#util#set_default( \ 'g:deoplete#delimiters', ['/']) call deoplete#util#set_default( \ 'g:deoplete#max_list', 100) call deoplete#util#set_default( \ 'g:deoplete#enable_profile', 0) call deoplete#util#set_default( \ 'g:deoplete#auto_complete_delay', 50) call deoplete#util#set_default( \ 'g:deoplete#auto_refresh_delay', 50) call deoplete#util#set_default( \ 'g:deoplete#max_abbr_width', 80) call deoplete#util#set_default( \ 'g:deoplete#max_menu_width', 40) call deoplete#util#set_default( \ 'g:deoplete#skip_chars', []) call deoplete#util#set_default( \ 'g:deoplete#complete_method', 'complete') call deoplete#util#set_default( \ 'g:deoplete#num_processes', s:is_windows ? 1 : 4) call deoplete#util#set_default( \ 'g:deoplete#keyword_patterns', {}) call deoplete#util#set_default( \ 'g:deoplete#_keyword_patterns', {}) call deoplete#util#set_default( \ 'g:deoplete#omni_patterns', {}) call deoplete#util#set_default( \ 'g:deoplete#_omni_patterns', {}) call deoplete#util#set_default( \ 'g:deoplete#sources', {}) call deoplete#util#set_default( \ 'g:deoplete#ignore_sources', {}) " Source variables call deoplete#util#set_default( \ 'g:deoplete#omni#input_patterns', {}) call deoplete#util#set_default( \ 'g:deoplete#omni#functions', {}) call deoplete#util#set_default( \ 'g:deoplete#member#prefix_patterns', {}) " Initialize default keyword pattern. call deoplete#util#set_pattern( \ g:deoplete#_keyword_patterns, \ '_', \ '[a-zA-Z_]\k*') " Initialize omni completion pattern. " Note: HTML omni func use search(). call deoplete#util#set_pattern( \ g:deoplete#_omni_patterns, \ 'html,xhtml,xml', ['<', ']*\s[[:alnum:]-]*']) endfunction function! deoplete#init#_context(event, sources) abort let input = deoplete#util#get_input(a:event) let [filetype, filetypes, same_filetypes] = \ deoplete#util#get_context_filetype(input, a:event) let sources = deoplete#util#convert2list(a:sources) if a:event !=# 'Manual' && empty(sources) " Use default sources let sources = deoplete#util#get_buffer_config( \ filetype, \ 'b:deoplete_sources', \ 'g:deoplete#sources', \ '{}', []) endif let keyword_patterns = join(deoplete#util#convert2list( \ deoplete#util#get_buffer_config( \ filetype, 'b:deoplete_keyword_patterns', \ 'g:deoplete#keyword_patterns', \ 'g:deoplete#_keyword_patterns')), '|') " Convert keyword pattern. let pattern = deoplete#util#vimoption2python( \ &l:iskeyword . (&l:lisp ? ',-' : '')) let keyword_patterns = substitute(keyword_patterns, \ '\\k', '\=pattern', 'g') let event = (deoplete#util#get_prev_event() ==# 'Refresh') ? \ 'Manual' : a:event let width = winwidth(0) - col('.') + len(matchstr(input, '\w*$')) let max_width = (width * 2 / 3) if a:event ==# 'BufNew' let bufnr = expand('') else let bufnr = bufnr('%') endif let bufname = bufname(bufnr) let bufpath = fnamemodify(bufname, ':p') if !filereadable(bufpath) || getbufvar(bufnr, '&buftype') =~# 'nofile' let bufpath = '' endif return { \ 'changedtick': b:changedtick, \ 'event': event, \ 'input': input, \ 'is_windows': s:is_windows, \ 'next_input': deoplete#util#get_next_input(a:event), \ 'complete_str': '', \ 'encoding': &encoding, \ 'position': getpos('.'), \ 'filetype': filetype, \ 'filetypes': filetypes, \ 'same_filetypes': same_filetypes, \ 'ignorecase': g:deoplete#enable_ignore_case, \ 'smartcase': g:deoplete#enable_smart_case, \ 'camelcase': g:deoplete#enable_camel_case, \ 'delay': g:deoplete#auto_complete_delay, \ 'sources': sources, \ 'keyword_patterns': keyword_patterns, \ 'max_abbr_width': max_width, \ 'max_kind_width': max_width, \ 'max_menu_width': max_width, \ 'runtimepath': &runtimepath, \ 'bufnr': bufnr, \ 'bufname': bufname, \ 'bufpath': bufpath, \ 'cwd': getcwd(), \ 'vars': filter(copy(g:), \ "stridx(v:key, 'deoplete#') == 0 \ && v:key !=# 'deoplete#_yarp'"), \ 'bufvars': filter(copy(b:), "stridx(v:key, 'deoplete_') == 0"), \ 'custom': deoplete#custom#get(), \ 'omni__omnifunc': &l:omnifunc, \ 'dict__dictionary': &l:dictionary, \ } endfunction