Fixed vim and zsh
This commit is contained in:
71
vim/plugins/deoplete.nvim/autoload/deoplete.vim
Normal file
71
vim/plugins/deoplete.nvim/autoload/deoplete.vim
Normal file
@ -0,0 +1,71 @@
|
||||
"=============================================================================
|
||||
" FILE: deoplete.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! deoplete#initialize() abort
|
||||
return deoplete#init#_initialize()
|
||||
endfunction
|
||||
function! deoplete#is_enabled() abort
|
||||
call deoplete#initialize()
|
||||
return deoplete#init#_is_enabled()
|
||||
endfunction
|
||||
function! deoplete#enable() abort
|
||||
if deoplete#initialize()
|
||||
return 1
|
||||
endif
|
||||
return deoplete#init#_enable()
|
||||
endfunction
|
||||
function! deoplete#disable() abort
|
||||
return deoplete#init#_disable()
|
||||
endfunction
|
||||
function! deoplete#toggle() abort
|
||||
return deoplete#is_enabled() ?
|
||||
\ deoplete#init#_disable() : deoplete#init#_enable()
|
||||
endfunction
|
||||
|
||||
function! deoplete#enable_logging(level, logfile) abort
|
||||
let g:deoplete#_logging = {'level': a:level, 'logfile': a:logfile}
|
||||
call deoplete#util#rpcnotify('deoplete_enable_logging', {})
|
||||
endfunction
|
||||
|
||||
function! deoplete#send_event(event) abort
|
||||
call deoplete#util#rpcnotify('deoplete_on_event',
|
||||
\ deoplete#init#_context(a:event, []))
|
||||
endfunction
|
||||
|
||||
function! deoplete#manual_complete(...) abort
|
||||
if !deoplete#is_enabled()
|
||||
return ''
|
||||
endif
|
||||
|
||||
" Start complete.
|
||||
return "\<C-r>=deoplete#mapping#_rpcrequest_wrapper("
|
||||
\ . string(get(a:000, 0, [])) . ")\<CR>"
|
||||
endfunction
|
||||
function! deoplete#close_popup() abort
|
||||
call deoplete#handler#_skip_next_completion()
|
||||
return pumvisible() ? "\<C-y>" : ''
|
||||
endfunction
|
||||
function! deoplete#smart_close_popup() abort
|
||||
call deoplete#handler#_skip_next_completion()
|
||||
return pumvisible() ? "\<C-e>" : ''
|
||||
endfunction
|
||||
function! deoplete#cancel_popup() abort
|
||||
return pumvisible() ? "\<C-e>" : ''
|
||||
endfunction
|
||||
function! deoplete#refresh() abort
|
||||
if exists('g:deoplete#_context')
|
||||
if get(g:deoplete#_context, 'event', '') ==# 'Manual'
|
||||
let g:deoplete#_context.event = 'Refresh'
|
||||
endif
|
||||
endif
|
||||
return pumvisible() ? "\<C-e>" : ''
|
||||
endfunction
|
||||
function! deoplete#undo_completion() abort
|
||||
return deoplete#mapping#_undo_completion()
|
||||
endfunction
|
||||
function! deoplete#complete_common_string() abort
|
||||
return deoplete#mapping#_complete_common_string()
|
||||
endfunction
|
44
vim/plugins/deoplete.nvim/autoload/deoplete/custom.vim
Normal file
44
vim/plugins/deoplete.nvim/autoload/deoplete/custom.vim
Normal file
@ -0,0 +1,44 @@
|
||||
"=============================================================================
|
||||
" FILE: custom.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! deoplete#custom#init() abort
|
||||
let s:custom = {}
|
||||
let s:custom.source = {}
|
||||
let s:custom.source._ = {}
|
||||
endfunction
|
||||
|
||||
function! deoplete#custom#get() abort
|
||||
if !exists('s:custom')
|
||||
call deoplete#custom#init()
|
||||
endif
|
||||
|
||||
return s:custom
|
||||
endfunction
|
||||
|
||||
function! deoplete#custom#get_source_var(source_name) abort
|
||||
let custom = deoplete#custom#get().source
|
||||
|
||||
if !has_key(custom, a:source_name)
|
||||
let custom[a:source_name] = {}
|
||||
endif
|
||||
|
||||
return custom[a:source_name]
|
||||
endfunction
|
||||
|
||||
function! deoplete#custom#set(source_name, option_name, value) abort
|
||||
return deoplete#custom#source(a:source_name, a:option_name, a:value)
|
||||
endfunction
|
||||
function! deoplete#custom#source(source_name, option_name, value) abort
|
||||
let value = index([
|
||||
\ 'filetypes', 'disabled_syntaxes',
|
||||
\ 'matchers', 'sorters', 'converters'
|
||||
\ ], a:option_name) < 0 ? a:value :
|
||||
\ deoplete#util#convert2list(a:value)
|
||||
for key in split(a:source_name, '\s*,\s*')
|
||||
let custom_source = deoplete#custom#get_source_var(key)
|
||||
let custom_source[a:option_name] = value
|
||||
endfor
|
||||
endfunction
|
286
vim/plugins/deoplete.nvim/autoload/deoplete/handler.vim
Normal file
286
vim/plugins/deoplete.nvim/autoload/deoplete/handler.vim
Normal file
@ -0,0 +1,286 @@
|
||||
"=============================================================================
|
||||
" FILE: handler.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! deoplete#handler#_init() abort
|
||||
augroup deoplete
|
||||
autocmd!
|
||||
autocmd InsertLeave * call s:on_insert_leave()
|
||||
autocmd CompleteDone * call s:on_complete_done()
|
||||
autocmd InsertLeave * call s:completion_timer_stop()
|
||||
augroup END
|
||||
|
||||
for event in ['InsertEnter', 'BufWritePost', 'DirChanged']
|
||||
call s:define_on_event(event)
|
||||
endfor
|
||||
|
||||
call s:define_completion_via_timer('TextChangedI')
|
||||
if g:deoplete#enable_on_insert_enter
|
||||
call s:define_completion_via_timer('InsertEnter')
|
||||
endif
|
||||
if g:deoplete#enable_refresh_always
|
||||
call s:define_completion_via_timer('InsertCharPre')
|
||||
endif
|
||||
|
||||
" Note: Vim 8 GUI is broken
|
||||
" dummy timer call is needed before complete()
|
||||
if !has('nvim') && has('gui_running')
|
||||
let s:dummy_timer = timer_start(200, {timer -> 0}, {'repeat': -1})
|
||||
endif
|
||||
|
||||
if deoplete#util#has_yarp()
|
||||
" To fix "RuntimeError: Event loop is closed" issue
|
||||
" Note: Workaround
|
||||
autocmd deoplete VimLeavePre * call s:kill_yarp()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! deoplete#handler#_do_complete() abort
|
||||
let context = g:deoplete#_context
|
||||
let event = get(context, 'event', '')
|
||||
let modes = (event ==# 'InsertEnter') ? ['n', 'i'] : ['i']
|
||||
if s:is_exiting() || index(modes, mode()) < 0
|
||||
call s:completion_timer_stop()
|
||||
return
|
||||
endif
|
||||
|
||||
if empty(get(context, 'candidates', []))
|
||||
\ || deoplete#util#get_input(context.event) !=# context.input
|
||||
return
|
||||
endif
|
||||
|
||||
let prev = g:deoplete#_prev_completion
|
||||
let prev.event = context.event
|
||||
let prev.candidates = context.candidates
|
||||
let prev.complete_position = getpos('.')
|
||||
|
||||
if context.event ==# 'Manual'
|
||||
let context.event = ''
|
||||
elseif !exists('g:deoplete#_saved_completeopt')
|
||||
call deoplete#mapping#_set_completeopt()
|
||||
endif
|
||||
|
||||
if g:deoplete#complete_method ==# 'complete'
|
||||
call feedkeys("\<Plug>_", 'i')
|
||||
elseif g:deoplete#complete_method ==# 'completefunc'
|
||||
let &l:completefunc = 'deoplete#mapping#_completefunc'
|
||||
call feedkeys("\<C-x>\<C-u>", 'in')
|
||||
elseif g:deoplete#complete_method ==# 'omnifunc'
|
||||
let &l:omnifunc = 'deoplete#mapping#_completefunc'
|
||||
call feedkeys("\<C-x>\<C-o>", 'in')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:completion_timer_start(event) abort
|
||||
if exists('s:completion_timer')
|
||||
call s:completion_timer_stop()
|
||||
endif
|
||||
|
||||
let delay = max([20, g:deoplete#auto_complete_delay])
|
||||
let s:completion_timer = timer_start(
|
||||
\ delay, {-> s:completion_begin(a:event)})
|
||||
endfunction
|
||||
function! s:completion_timer_stop() abort
|
||||
if !exists('s:completion_timer')
|
||||
return
|
||||
endif
|
||||
|
||||
call timer_stop(s:completion_timer)
|
||||
unlet s:completion_timer
|
||||
endfunction
|
||||
|
||||
function! deoplete#handler#_async_timer_start() abort
|
||||
if exists('s:async_timer')
|
||||
call deoplete#handler#_async_timer_stop()
|
||||
endif
|
||||
|
||||
let s:async_timer = { 'event': 'Async', 'changedtick': b:changedtick }
|
||||
let s:async_timer.id = timer_start(
|
||||
\ max([20, g:deoplete#auto_refresh_delay]),
|
||||
\ function('s:completion_async'), {'repeat': -1})
|
||||
endfunction
|
||||
function! deoplete#handler#_async_timer_stop() abort
|
||||
if exists('s:async_timer')
|
||||
call timer_stop(s:async_timer.id)
|
||||
unlet s:async_timer
|
||||
endif
|
||||
endfunction
|
||||
function! s:completion_async(timer) abort
|
||||
if mode() !=# 'i' || s:is_exiting()
|
||||
call deoplete#handler#_async_timer_stop()
|
||||
return
|
||||
endif
|
||||
|
||||
call s:completion_begin(s:async_timer.event)
|
||||
endfunction
|
||||
|
||||
function! s:completion_begin(event) abort
|
||||
if s:is_skip(a:event)
|
||||
call deoplete#mapping#_restore_completeopt()
|
||||
let g:deoplete#_context.candidates = []
|
||||
return
|
||||
endif
|
||||
|
||||
let context = deoplete#init#_context(a:event, [])
|
||||
if s:check_omnifunc(context)
|
||||
return
|
||||
endif
|
||||
|
||||
call deoplete#util#rpcnotify(
|
||||
\ 'deoplete_auto_completion_begin', context)
|
||||
endfunction
|
||||
function! s:is_skip(event) abort
|
||||
if s:is_skip_text(a:event)
|
||||
return 1
|
||||
endif
|
||||
|
||||
let disable_auto_complete =
|
||||
\ deoplete#util#get_simple_buffer_config(
|
||||
\ 'b:deoplete_disable_auto_complete',
|
||||
\ 'g:deoplete#disable_auto_complete')
|
||||
|
||||
if &paste
|
||||
\ || (a:event !=# 'Manual' && a:event !=# 'Async'
|
||||
\ && disable_auto_complete)
|
||||
\ || (&l:completefunc !=# '' && &l:buftype =~# 'nofile')
|
||||
\ || (a:event !=# 'InsertEnter' && mode() !=# 'i')
|
||||
return 1
|
||||
endif
|
||||
|
||||
return 0
|
||||
endfunction
|
||||
function! s:is_skip_text(event) abort
|
||||
let context = g:deoplete#_context
|
||||
let input = deoplete#util#get_input(a:event)
|
||||
|
||||
if has_key(context, 'input')
|
||||
\ && a:event !=# 'Manual'
|
||||
\ && a:event !=# 'Async'
|
||||
\ && input ==# context.input
|
||||
return 1
|
||||
endif
|
||||
|
||||
let displaywidth = strdisplaywidth(input) + 1
|
||||
if &l:formatoptions =~# '[tca]' && &l:textwidth > 0
|
||||
\ && displaywidth >= &l:textwidth
|
||||
if &l:formatoptions =~# '[ta]'
|
||||
\ || !empty(filter(deoplete#util#get_syn_names(),
|
||||
\ "v:val ==# 'Comment'"))
|
||||
return 1
|
||||
endif
|
||||
endif
|
||||
|
||||
let skip_chars = deoplete#util#get_simple_buffer_config(
|
||||
\ 'b:deoplete_skip_chars', 'g:deoplete#skip_chars')
|
||||
|
||||
return (!pumvisible() && virtcol('.') != displaywidth)
|
||||
\ || (a:event !=# 'Manual' && input !=# ''
|
||||
\ && index(skip_chars, input[-1:]) >= 0)
|
||||
endfunction
|
||||
function! s:check_omnifunc(context) abort
|
||||
let prev = g:deoplete#_prev_completion
|
||||
let blacklist = ['LanguageClient#complete']
|
||||
if prev.event ==# 'Manual'
|
||||
\ || &l:omnifunc ==# ''
|
||||
\ || index(blacklist, &l:omnifunc) >= 0
|
||||
\ || prev.complete_position ==# getpos('.')
|
||||
return
|
||||
endif
|
||||
|
||||
for filetype in a:context.filetypes
|
||||
for pattern in deoplete#util#convert2list(
|
||||
\ deoplete#util#get_buffer_config(filetype,
|
||||
\ 'b:deoplete_omni_patterns',
|
||||
\ 'g:deoplete#omni_patterns',
|
||||
\ 'g:deoplete#_omni_patterns'))
|
||||
if pattern !=# '' && a:context.input =~# '\%('.pattern.'\)$'
|
||||
let g:deoplete#_context.candidates = []
|
||||
|
||||
let prev.event = a:context.event
|
||||
let prev.candidates = []
|
||||
let prev.complete_position = getpos('.')
|
||||
|
||||
call deoplete#mapping#_set_completeopt()
|
||||
call feedkeys("\<C-x>\<C-o>", 'in')
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! s:define_on_event(event) abort
|
||||
if !exists('##' . a:event)
|
||||
return
|
||||
endif
|
||||
|
||||
execute 'autocmd deoplete' a:event
|
||||
\ '* call deoplete#send_event('.string(a:event).')'
|
||||
endfunction
|
||||
function! s:define_completion_via_timer(event) abort
|
||||
if !exists('##' . a:event)
|
||||
return
|
||||
endif
|
||||
|
||||
execute 'autocmd deoplete' a:event
|
||||
\ '* call s:completion_timer_start('.string(a:event).')'
|
||||
endfunction
|
||||
|
||||
function! s:on_insert_leave() abort
|
||||
call deoplete#mapping#_restore_completeopt()
|
||||
let g:deoplete#_context = {}
|
||||
let g:deoplete#_prev_completion = {
|
||||
\ 'complete_position': [],
|
||||
\ 'candidates': [],
|
||||
\ 'event': '',
|
||||
\ }
|
||||
endfunction
|
||||
|
||||
function! s:on_complete_done() abort
|
||||
if get(v:completed_item, 'word', '') ==# ''
|
||||
return
|
||||
endif
|
||||
|
||||
let word = v:completed_item.word
|
||||
if !has_key(g:deoplete#_rank, word)
|
||||
let g:deoplete#_rank[word] = 1
|
||||
else
|
||||
let g:deoplete#_rank[word] += 1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! deoplete#handler#_skip_next_completion() abort
|
||||
if !exists('g:deoplete#_context')
|
||||
return
|
||||
endif
|
||||
|
||||
let input = deoplete#util#get_input('CompleteDone')
|
||||
if input[-1:] !=# '/'
|
||||
let g:deoplete#_context.input = input
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:is_exiting() abort
|
||||
return exists('v:exiting') && v:exiting != v:null
|
||||
endfunction
|
||||
|
||||
function! s:kill_yarp() abort
|
||||
if g:deoplete#_yarp.job_is_dead
|
||||
return
|
||||
endif
|
||||
|
||||
let job = g:deoplete#_yarp.job
|
||||
if !has('nvim') && !exists('g:yarp_jobstart')
|
||||
" Get job object from vim-hug-neovim-rpc
|
||||
let job = g:_neovim_rpc_jobs[job].job
|
||||
endif
|
||||
|
||||
if has('nvim')
|
||||
call jobstop(job)
|
||||
else
|
||||
call job_stop(job, 'kill')
|
||||
endif
|
||||
|
||||
let g:deoplete#_yarp.job_is_dead = 1
|
||||
endfunction
|
279
vim/plugins/deoplete.nvim/autoload/deoplete/init.vim
Normal file
279
vim/plugins/deoplete.nvim/autoload/deoplete/init.vim
Normal file
@ -0,0 +1,279 @@
|
||||
"=============================================================================
|
||||
" FILE: init.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" 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('<abuf>')
|
||||
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
|
94
vim/plugins/deoplete.nvim/autoload/deoplete/mapping.vim
Normal file
94
vim/plugins/deoplete.nvim/autoload/deoplete/mapping.vim
Normal file
@ -0,0 +1,94 @@
|
||||
"=============================================================================
|
||||
" FILE: mapping.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! deoplete#mapping#_init() abort
|
||||
inoremap <silent> <Plug>_
|
||||
\ <C-r>=deoplete#mapping#_complete()<CR>
|
||||
endfunction
|
||||
|
||||
function! deoplete#mapping#_completefunc(findstart, base) abort
|
||||
if a:findstart
|
||||
return g:deoplete#_context.complete_position
|
||||
else
|
||||
return g:deoplete#_context.candidates
|
||||
endif
|
||||
endfunction
|
||||
function! deoplete#mapping#_complete() abort
|
||||
call complete(g:deoplete#_context.complete_position + 1,
|
||||
\ g:deoplete#_context.candidates)
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
function! deoplete#mapping#_set_completeopt() abort
|
||||
if exists('g:deoplete#_saved_completeopt')
|
||||
return
|
||||
endif
|
||||
let g:deoplete#_saved_completeopt = &completeopt
|
||||
set completeopt-=longest
|
||||
set completeopt+=menuone
|
||||
set completeopt-=menu
|
||||
if &completeopt !~# 'noinsert\|noselect'
|
||||
set completeopt+=noselect
|
||||
endif
|
||||
endfunction
|
||||
function! deoplete#mapping#_restore_completeopt() abort
|
||||
if exists('g:deoplete#_saved_completeopt')
|
||||
let &completeopt = g:deoplete#_saved_completeopt
|
||||
unlet g:deoplete#_saved_completeopt
|
||||
endif
|
||||
endfunction
|
||||
function! deoplete#mapping#_rpcrequest_wrapper(sources) abort
|
||||
return deoplete#util#rpcnotify(
|
||||
\ 'deoplete_manual_completion_begin',
|
||||
\ deoplete#init#_context('Manual', a:sources))
|
||||
endfunction
|
||||
function! deoplete#mapping#_undo_completion() abort
|
||||
if !exists('v:completed_item') || empty(v:completed_item)
|
||||
return ''
|
||||
endif
|
||||
|
||||
let input = deoplete#util#get_input('')
|
||||
if strridx(input, v:completed_item.word) !=
|
||||
\ len(input) - len(v:completed_item.word)
|
||||
return ''
|
||||
endif
|
||||
|
||||
return deoplete#smart_close_popup() .
|
||||
\ repeat("\<C-h>", strchars(v:completed_item.word))
|
||||
endfunction
|
||||
function! deoplete#mapping#_complete_common_string() abort
|
||||
if !deoplete#is_enabled()
|
||||
return ''
|
||||
endif
|
||||
|
||||
" Get cursor word.
|
||||
let complete_str = matchstr(deoplete#util#get_input(''), '\w*$')
|
||||
|
||||
if complete_str ==# '' || !has_key(g:deoplete#_context, 'candidates')
|
||||
return ''
|
||||
endif
|
||||
|
||||
let candidates = filter(copy(g:deoplete#_context.candidates),
|
||||
\ 'stridx(tolower(v:val.word), tolower(complete_str)) == 0')
|
||||
|
||||
if empty(candidates)
|
||||
return ''
|
||||
endif
|
||||
|
||||
let common_str = candidates[0].word
|
||||
for candidate in candidates[1:]
|
||||
while stridx(tolower(candidate.word), tolower(common_str)) != 0
|
||||
let common_str = common_str[: -2]
|
||||
endwhile
|
||||
endfor
|
||||
|
||||
if common_str ==# '' || complete_str ==? common_str
|
||||
return ''
|
||||
endif
|
||||
|
||||
return (pumvisible() ? "\<C-e>" : '')
|
||||
\ . repeat("\<BS>", strchars(complete_str)) . common_str
|
||||
endfunction
|
28
vim/plugins/deoplete.nvim/autoload/deoplete/mappings.vim
Normal file
28
vim/plugins/deoplete.nvim/autoload/deoplete/mappings.vim
Normal file
@ -0,0 +1,28 @@
|
||||
"=============================================================================
|
||||
" FILE: mappings.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
" For compatibility.
|
||||
|
||||
function! deoplete#mappings#manual_complete(...) abort
|
||||
return call('deoplete#manual_complete', a:000)
|
||||
endfunction
|
||||
|
||||
function! deoplete#mappings#close_popup() abort
|
||||
return deoplete#close_popup()
|
||||
endfunction
|
||||
function! deoplete#mappings#smart_close_popup() abort
|
||||
return deoplete#smart_close_popup()
|
||||
endfunction
|
||||
function! deoplete#mappings#cancel_popup() abort
|
||||
return deoplete#cancel_popup()
|
||||
endfunction
|
||||
function! deoplete#mappings#refresh() abort
|
||||
return deoplete#refresh()
|
||||
endfunction
|
||||
|
||||
function! deoplete#mappings#undo_completion() abort
|
||||
return deoplete#undo_completion()
|
||||
endfunction
|
261
vim/plugins/deoplete.nvim/autoload/deoplete/util.vim
Normal file
261
vim/plugins/deoplete.nvim/autoload/deoplete/util.vim
Normal file
@ -0,0 +1,261 @@
|
||||
"=============================================================================
|
||||
" FILE: util.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! deoplete#util#set_default(var, val, ...) abort
|
||||
if !exists(a:var) || type({a:var}) != type(a:val)
|
||||
let alternate_var = get(a:000, 0, '')
|
||||
|
||||
let {a:var} = exists(alternate_var) ?
|
||||
\ {alternate_var} : a:val
|
||||
endif
|
||||
endfunction
|
||||
function! deoplete#util#set_pattern(variable, keys, pattern) abort
|
||||
for key in split(a:keys, '\s*,\s*')
|
||||
if !has_key(a:variable, key)
|
||||
let a:variable[key] = a:pattern
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
function! deoplete#util#get_buffer_config(
|
||||
\ filetype, buffer_var, user_var, default_var, ...) abort
|
||||
let default_val = get(a:000, 0, '')
|
||||
|
||||
if exists(a:buffer_var)
|
||||
return {a:buffer_var}
|
||||
endif
|
||||
|
||||
let filetype = !has_key({a:user_var}, a:filetype)
|
||||
\ && !has_key(eval(a:default_var), a:filetype) ? '_' : a:filetype
|
||||
|
||||
return get({a:user_var}, filetype,
|
||||
\ get(eval(a:default_var), filetype, default_val))
|
||||
endfunction
|
||||
function! deoplete#util#get_simple_buffer_config(buffer_var, user_var) abort
|
||||
return exists(a:buffer_var) ? {a:buffer_var} : {a:user_var}
|
||||
endfunction
|
||||
function! deoplete#util#print_error(string, ...) abort
|
||||
let name = a:0 ? a:1 : 'deoplete'
|
||||
echohl Error | echomsg printf('[%s] %s', name,
|
||||
\ deoplete#util#string(a:string)) | echohl None
|
||||
endfunction
|
||||
function! deoplete#util#print_warning(string) abort
|
||||
echohl WarningMsg | echomsg '[deoplete] '
|
||||
\ . deoplete#util#string(a:string) | echohl None
|
||||
endfunction
|
||||
function! deoplete#util#print_debug(string) abort
|
||||
echomsg '[deoplete] ' . deoplete#util#string(a:string)
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#convert2list(expr) abort
|
||||
return type(a:expr) ==# v:t_list ? a:expr : [a:expr]
|
||||
endfunction
|
||||
function! deoplete#util#string(expr) abort
|
||||
return type(a:expr) ==# v:t_string ? a:expr : string(a:expr)
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#get_input(event) abort
|
||||
let mode = mode()
|
||||
if a:event ==# 'InsertEnter'
|
||||
let mode = 'i'
|
||||
endif
|
||||
let input = (mode ==# 'i' ? (col('.')-1) : col('.')) >= len(getline('.')) ?
|
||||
\ getline('.') :
|
||||
\ matchstr(getline('.'),
|
||||
\ '^.*\%' . (mode ==# 'i' ? col('.') : col('.') - 1)
|
||||
\ . 'c' . (mode ==# 'i' ? '' : '.'))
|
||||
|
||||
if input =~# '^.\{-}\ze\S\+$'
|
||||
let complete_str = matchstr(input, '\S\+$')
|
||||
let input = matchstr(input, '^.\{-}\ze\S\+$')
|
||||
else
|
||||
let complete_str = ''
|
||||
endif
|
||||
|
||||
if a:event ==# 'InsertCharPre'
|
||||
let complete_str .= v:char
|
||||
endif
|
||||
|
||||
return input . complete_str
|
||||
endfunction
|
||||
function! deoplete#util#get_next_input(event) abort
|
||||
return getline('.')[len(deoplete#util#get_input(a:event)) :]
|
||||
endfunction
|
||||
function! deoplete#util#get_prev_event() abort
|
||||
return get(g:deoplete#_context, 'event', '')
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#vimoption2python(option) abort
|
||||
return '[a-zA-Z' . s:vimoption2python(a:option) . ']'
|
||||
endfunction
|
||||
function! deoplete#util#vimoption2python_not(option) abort
|
||||
return '[^a-zA-Z' . s:vimoption2python(a:option) . ']'
|
||||
endfunction
|
||||
function! s:vimoption2python(option) abort
|
||||
let has_dash = 0
|
||||
let patterns = []
|
||||
for pattern in split(a:option, ',')
|
||||
if pattern ==# ''
|
||||
" ,
|
||||
call add(patterns, ',')
|
||||
elseif pattern ==# '\'
|
||||
call add(patterns, '\\')
|
||||
elseif pattern ==# '-'
|
||||
let has_dash = 1
|
||||
elseif pattern =~# '\d\+'
|
||||
call add(patterns, substitute(pattern, '\d\+',
|
||||
\ '\=nr2char(submatch(0))', 'g'))
|
||||
else
|
||||
call add(patterns, pattern)
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Dash must be last.
|
||||
if has_dash
|
||||
call add(patterns, '-')
|
||||
endif
|
||||
|
||||
return join(deoplete#util#uniq(patterns), '')
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#uniq(list) abort
|
||||
let list = map(copy(a:list), '[v:val, v:val]')
|
||||
let i = 0
|
||||
let seen = {}
|
||||
while i < len(list)
|
||||
let key = string(list[i][1])
|
||||
if has_key(seen, key)
|
||||
call remove(list, i)
|
||||
else
|
||||
let seen[key] = 1
|
||||
let i += 1
|
||||
endif
|
||||
endwhile
|
||||
return map(list, 'v:val[0]')
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#get_syn_names() abort
|
||||
if col('$') >= 200
|
||||
return []
|
||||
endif
|
||||
|
||||
let names = []
|
||||
try
|
||||
" Note: synstack() seems broken in concealed text.
|
||||
for id in synstack(line('.'), (mode() ==# 'i' ? col('.')-1 : col('.')))
|
||||
let name = synIDattr(id, 'name')
|
||||
call add(names, name)
|
||||
if synIDattr(synIDtrans(id), 'name') !=# name
|
||||
call add(names, synIDattr(synIDtrans(id), 'name'))
|
||||
endif
|
||||
endfor
|
||||
catch
|
||||
" Ignore error
|
||||
endtry
|
||||
return names
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#neovim_version() abort
|
||||
redir => v
|
||||
silent version
|
||||
redir END
|
||||
return split(v, '\n')[0]
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#has_yarp() abort
|
||||
return !has('nvim') || get(g:, 'deoplete#enable_yarp', 0)
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#get_context_filetype(input, event) abort
|
||||
if !exists('s:context_filetype')
|
||||
let s:context_filetype = {}
|
||||
|
||||
" Force context_filetype call.
|
||||
try
|
||||
call context_filetype#get_filetype()
|
||||
catch
|
||||
" Ignore error
|
||||
endtry
|
||||
endif
|
||||
|
||||
if empty(s:context_filetype)
|
||||
\ || s:context_filetype.prev_filetype !=# &filetype
|
||||
\ || s:context_filetype.line != line('.')
|
||||
\ || s:context_filetype.bufnr != bufnr('%')
|
||||
\ || (a:input =~# '\W$' &&
|
||||
\ substitute(a:input, '\s\zs\s\+$', '', '') !=#
|
||||
\ substitute(s:context_filetype.input, '\s\zs\s\+$', '', ''))
|
||||
\ || (a:input =~# '\w$' &&
|
||||
\ substitute(a:input, '\w\+$', '', '') !=#
|
||||
\ substitute(s:context_filetype.input, '\w\+$', '', ''))
|
||||
\ || a:event ==# 'InsertEnter'
|
||||
|
||||
let s:context_filetype.line = line('.')
|
||||
let s:context_filetype.bufnr = bufnr('%')
|
||||
let s:context_filetype.input = a:input
|
||||
let s:context_filetype.prev_filetype = &filetype
|
||||
let s:context_filetype.filetype =
|
||||
\ (exists('*context_filetype#get_filetype') ?
|
||||
\ context_filetype#get_filetype() :
|
||||
\ (&filetype ==# '' ? 'nothing' : &filetype))
|
||||
let s:context_filetype.filetypes =
|
||||
\ exists('*context_filetype#get_filetypes') ?
|
||||
\ context_filetype#get_filetypes() :
|
||||
\ &filetype ==# '' ? ['nothing'] :
|
||||
\ deoplete#util#uniq([&filetype]
|
||||
\ + split(&filetype, '\.'))
|
||||
let s:context_filetype.same_filetypes =
|
||||
\ exists('*context_filetype#get_same_filetypes') ?
|
||||
\ context_filetype#get_same_filetypes() : []
|
||||
endif
|
||||
return [ s:context_filetype.filetype,
|
||||
\ s:context_filetype.filetypes, s:context_filetype.same_filetypes]
|
||||
endfunction
|
||||
|
||||
function! deoplete#util#rpcnotify(event, context) abort
|
||||
if deoplete#init#_check_channel()
|
||||
return ''
|
||||
endif
|
||||
call s:notify(a:event, a:context)
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! s:notify(event, context) abort
|
||||
let a:context['rpc'] = a:event
|
||||
|
||||
if deoplete#util#has_yarp()
|
||||
if g:deoplete#_yarp.job_is_dead
|
||||
return
|
||||
endif
|
||||
call g:deoplete#_yarp.notify(a:event, a:context)
|
||||
else
|
||||
call rpcnotify(g:deoplete#_channel_id, a:event, a:context)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Compare versions. Return values is the distance between versions. Each
|
||||
" version integer (from right to left) is an ascending power of 100.
|
||||
"
|
||||
" Example:
|
||||
" '0.1.10' is (1 * 100) + 10, or 110.
|
||||
" '1.2.3' is (1 * 10000) + (2 * 100) + 3, or 10203.
|
||||
"
|
||||
" Returns:
|
||||
" <0 if a < b
|
||||
" >0 if a > b
|
||||
" 0 if versions are equal.
|
||||
function! deoplete#util#versioncmp(a, b) abort
|
||||
let a = map(split(a:a, '\.'), 'str2nr(v:val)')
|
||||
let b = map(split(a:b, '\.'), 'str2nr(v:val)')
|
||||
let l = min([len(a), len(b)])
|
||||
let d = 0
|
||||
|
||||
" Only compare the parts that are common to both versions.
|
||||
for i in range(l)
|
||||
let d += (a[i] - b[i]) * pow(100, l - i - 1)
|
||||
endfor
|
||||
|
||||
return d
|
||||
endfunction
|
70
vim/plugins/deoplete.nvim/autoload/health/deoplete.vim
Normal file
70
vim/plugins/deoplete.nvim/autoload/health/deoplete.vim
Normal file
@ -0,0 +1,70 @@
|
||||
"=============================================================================
|
||||
" FILE: deoplete.vim
|
||||
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||
" TJ DeVries <devries.timothyj at gmail.com>
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! s:check_neovim() abort
|
||||
if has('nvim')
|
||||
call health#report_ok('has("nvim") was successful')
|
||||
else
|
||||
call health#report_error('has("nvim") was not successful',
|
||||
\ 'Deoplete only works for neovim!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:check_t_list() abort
|
||||
if exists('v:t_list')
|
||||
call health#report_ok('exists("v:t_list") was successful')
|
||||
else
|
||||
call health#report_error('exists("v:t_list") was not successful',
|
||||
\ 'Deoplete requires neovim 0.2.0+!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:check_timers() abort
|
||||
if has('timers')
|
||||
call health#report_ok('has("timers") was successful')
|
||||
else
|
||||
call health#report_error('has("timers") was not successful',
|
||||
\ 'Deoplete requires timers support("+timers").')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:check_required_python_for_deoplete() abort
|
||||
if has('python3')
|
||||
call health#report_ok('has("python3") was successful')
|
||||
else
|
||||
call health#report_error('has("python3") was not successful', [
|
||||
\ 'Please install the python3 package for neovim.',
|
||||
\ 'A good guide can be found here: ' .
|
||||
\ 'https://github.com/tweekmonster/nvim-python-doctor/'
|
||||
\ . 'wiki/Advanced:-Using-pyenv'
|
||||
\ ]
|
||||
\ )
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:still_have_issues() abort
|
||||
let indentation = ' '
|
||||
call health#report_info("If you're still having problems, " .
|
||||
\ "try the following commands:\n" .
|
||||
\ indentation . "$ export NVIM_PYTHON_LOG_FILE=/tmp/log\n" .
|
||||
\ indentation . "$ export NVIM_PYTHON_LOG_LEVEL=DEBUG\n" .
|
||||
\ indentation . "$ nvim\n" .
|
||||
\ indentation . "$ cat /tmp/log_{PID}\n" .
|
||||
\ indentation . ' and then create an issue on github'
|
||||
\ )
|
||||
endfunction
|
||||
|
||||
function! health#deoplete#check() abort
|
||||
call health#report_start('deoplete.nvim')
|
||||
|
||||
call s:check_neovim()
|
||||
call s:check_t_list()
|
||||
call s:check_timers()
|
||||
call s:check_required_python_for_deoplete()
|
||||
|
||||
call s:still_have_issues()
|
||||
endfunction
|
Reference in New Issue
Block a user