Fixed vim and zsh

This commit is contained in:
2018-04-05 13:06:54 +02:00
parent f9db886bd3
commit 0331f6518a
2009 changed files with 256303 additions and 0 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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