123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- "=============================================================================
- " FILE: helper.vim
- " AUTHOR: Shougo Matsushita <Shougo.Matsu@gmail.com>
- " License: MIT license {{{
- " Permission is hereby granted, free of charge, to any person obtaining
- " a copy of this software and associated documentation files (the
- " "Software"), to deal in the Software without restriction, including
- " without limitation the rights to use, copy, modify, merge, publish,
- " distribute, sublicense, and/or sell copies of the Software, and to
- " permit persons to whom the Software is furnished to do so, subject to
- " the following conditions:
- "
- " The above copyright notice and this permission notice shall be included
- " in all copies or substantial portions of the Software.
- "
- " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- " OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- " IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- " CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- " TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- " SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- " }}}
- "=============================================================================
- let s:save_cpo = &cpo
- set cpo&vim
- function! neocomplete#helper#get_cur_text(...) abort "{{{
- let neocomplete = neocomplete#get_current_neocomplete()
- let is_skip_char = get(a:000, 0, 0)
- let mode = mode()
- if neocomplete.event ==# 'InsertEnter'
- let mode = 'i'
- endif
- let cur_text =
- \ (mode ==# 'i' ?
- \ (col('.')-1) : col('.')) >= len(getline('.')) ?
- \ getline('.') :
- \ matchstr(getline('.'),
- \ '^.*\%' . (mode ==# 'i' && !is_skip_char ?
- \ col('.') : col('.') - 1)
- \ . 'c' . (mode ==# 'i' ? '' : '.'))
- if cur_text =~ '^.\{-}\ze\S\+$'
- let complete_str = matchstr(cur_text, '\S\+$')
- let cur_text = matchstr(cur_text, '^.\{-}\ze\S\+$')
- else
- let complete_str = ''
- endif
- if neocomplete.event ==# 'InsertCharPre'
- let complete_str .= v:char
- endif
- let neocomplete.cur_text = cur_text . complete_str
- " Save cur_text.
- return neocomplete.cur_text
- endfunction"}}}
- function! neocomplete#helper#get_force_omni_complete_pos(cur_text) abort "{{{
- let filetype = neocomplete#get_context_filetype()
- let omnifunc = &l:omnifunc
- if neocomplete#helper#check_invalid_omnifunc(omnifunc)
- return -1
- endif
- let pattern = ''
- if has_key(g:neocomplete#force_omni_input_patterns, omnifunc)
- let pattern = g:neocomplete#force_omni_input_patterns[omnifunc]
- elseif filetype != '' &&
- \ get(g:neocomplete#force_omni_input_patterns, filetype, '') != ''
- let pattern = g:neocomplete#force_omni_input_patterns[filetype]
- endif
- if pattern == ''
- return -1
- endif
- return match(a:cur_text, '\%(' . pattern . '\m\)$')
- endfunction"}}}
- function! neocomplete#helper#is_enabled_source(source, filetype) abort "{{{
- let source = type(a:source) == type('') ?
- \ get(neocomplete#variables#get_sources(), a:source, {})
- \ : a:source
- return !empty(source) && (empty(source.filetypes) ||
- \ neocomplete#helper#check_filetype(source.filetypes))
- \ && (!get(source.disabled_filetypes, '_', 0) &&
- \ !neocomplete#helper#check_filetype(source.disabled_filetypes))
- endfunction"}}}
- function! neocomplete#helper#get_source_filetypes(filetype) abort "{{{
- return neocomplete#context_filetype#filetypes()
- endfunction"}}}
- function! neocomplete#helper#complete_check() abort "{{{
- let neocomplete = neocomplete#get_current_neocomplete()
- if g:neocomplete#enable_debug
- echomsg split(reltimestr(reltime(neocomplete.start_time)))[0]
- endif
- let ret =
- \ neocomplete#is_auto_complete()
- \ && g:neocomplete#skip_auto_completion_time != ''
- \ && split(reltimestr(reltime(neocomplete.start_time)))[0] >
- \ g:neocomplete#skip_auto_completion_time
- if ret
- let neocomplete = neocomplete#get_current_neocomplete()
- let neocomplete.skipped = 1
- call neocomplete#print_debug('Skipped.')
- endif
- return ret
- endfunction"}}}
- function! neocomplete#helper#get_syn_name(is_trans) abort "{{{
- return len(getline('.')) < 200 ?
- \ synIDattr(synIDtrans(synID(line('.'), mode() ==# 'i' ?
- \ col('.')-1 : col('.'), a:is_trans)), 'name') : ''
- endfunction"}}}
- function! neocomplete#helper#match_word(cur_text, ...) abort "{{{
- let pattern = a:0 >= 1 ? a:1 : neocomplete#get_keyword_pattern_end()
- " Check wildcard.
- let complete_pos = match(a:cur_text, pattern)
- let complete_str = (complete_pos >=0) ?
- \ a:cur_text[complete_pos :] : ''
- return [complete_pos, complete_str]
- endfunction"}}}
- function! neocomplete#helper#filetype_complete(arglead, cmdline, cursorpos) abort "{{{
- " Dup check.
- let ret = {}
- for item in map(
- \ split(globpath(&runtimepath, 'syntax/*.vim'), '\n') +
- \ split(globpath(&runtimepath, 'indent/*.vim'), '\n') +
- \ split(globpath(&runtimepath, 'ftplugin/*.vim'), '\n')
- \ , 'fnamemodify(v:val, ":t:r")')
- if !has_key(ret, item) && item =~ '^'.a:arglead
- let ret[item] = 1
- endif
- endfor
- return sort(keys(ret))
- endfunction"}}}
- function! neocomplete#helper#unite_patterns(pattern_var, filetype) abort "{{{
- let keyword_patterns = []
- lua << EOF
- do
- local patterns = vim.eval('keyword_patterns')
- local filetypes = vim.eval("split(a:filetype, '\\.')")
- local pattern_var = vim.eval('a:pattern_var')
- local dup_check = {}
- for i = 0, #filetypes-1 do
- local ft = filetypes[i]
- -- Composite filetype.
- if pattern_var[ft] ~= nil and dup_check[ft] == nil then
- dup_check[ft] = 1
- patterns:add(pattern_var[ft])
- end
- end
- if #patterns == 0 then
- local default = pattern_var['_']
- if default == nil then
- default = pattern_var['default']
- end
- if default ~= nil and default ~= '' then
- patterns:add(default)
- end
- end
- end
- EOF
- return join(keyword_patterns, '\m\|')
- endfunction"}}}
- function! neocomplete#helper#check_filetype(dictionary) abort "{{{
- return !empty(filter(neocomplete#context_filetype#filetypes(),
- \ 'get(a:dictionary, v:val, 0)'))
- endfunction"}}}
- function! neocomplete#helper#get_sources_list(...) abort "{{{
- let filetype = neocomplete#get_context_filetype()
- let source_names = exists('b:neocomplete_sources') ?
- \ b:neocomplete_sources :
- \ get(a:000, 0,
- \ get(g:neocomplete#sources, filetype,
- \ get(g:neocomplete#sources, '_', ['_'])))
- call neocomplete#init#_sources(source_names)
- let all_sources = neocomplete#available_sources()
- let sources = {}
- for source_name in source_names
- if source_name ==# '_'
- " All sources.
- let sources = all_sources
- break
- endif
- if !has_key(all_sources, source_name)
- call neocomplete#print_warning(printf(
- \ 'Invalid source name "%s" is given.', source_name))
- continue
- endif
- let sources[source_name] = all_sources[source_name]
- endfor
- let neocomplete = neocomplete#get_current_neocomplete()
- let neocomplete.sources = filter(sources, "
- \ empty(v:val.filetypes) ||
- \ neocomplete#helper#check_filetype(v:val.filetypes)")
- let neocomplete.sources_filetype = neocomplete.context_filetype
- return neocomplete.sources
- endfunction"}}}
- function! neocomplete#helper#clear_result() abort "{{{
- let neocomplete = neocomplete#get_current_neocomplete()
- let neocomplete.complete_str = ''
- let neocomplete.candidates = []
- let neocomplete.complete_sources = []
- let neocomplete.complete_pos = -1
- " Restore completeopt.
- if neocomplete.completeopt !=# &completeopt
- " Restore completeopt.
- let &completeopt = neocomplete.completeopt
- endif
- endfunction"}}}
- function! neocomplete#helper#call_hook(sources, hook_name, context) abort "{{{
- for source in neocomplete#util#convert2list(a:sources)
- try
- if has_key(source.hooks, a:hook_name)
- call call(source.hooks[a:hook_name],
- \ [extend(source.neocomplete__context, a:context)],
- \ source.hooks)
- endif
- catch
- call neocomplete#print_error(v:throwpoint)
- call neocomplete#print_error(v:exception)
- call neocomplete#print_error(
- \ 'Error occurred in calling hook "' . a:hook_name . '"!')
- call neocomplete#print_error(
- \ 'Source name is ' . source.name)
- endtry
- endfor
- endfunction"}}}
- function! neocomplete#helper#call_filters(filters, source, context) abort "{{{
- let context = extend(a:source.neocomplete__context, a:context)
- for filter in a:filters
- try
- let context.candidates = call(filter.filter, [context], filter)
- catch
- call neocomplete#print_error(v:throwpoint)
- call neocomplete#print_error(v:exception)
- call neocomplete#print_error(
- \ 'Error occurred in calling filter '
- \ . filter.name . '!')
- call neocomplete#print_error(
- \ 'Source name is ' . a:source.name)
- endtry
- endfor
- return context.candidates
- endfunction"}}}
- function! neocomplete#helper#sort_human(candidates) abort "{{{
- " Use lua interface.
- lua << EOF
- do
- local candidates = vim.eval('a:candidates')
- local t = {}
- for i = 1, #candidates do
- t[i] = candidates[i-1]
- end
- table.sort(t, function(a, b) return a.word < b.word end)
- for i = 0, #candidates-1 do
- candidates[i] = t[i+1]
- end
- end
- EOF
- return a:candidates
- endfunction"}}}
- function! neocomplete#helper#check_invalid_omnifunc(omnifunc) abort "{{{
- return a:omnifunc == '' || (a:omnifunc !~ '#' && !exists('*' . a:omnifunc))
- endfunction"}}}
- function! neocomplete#helper#indent_current_line() abort "{{{
- let pos = getpos('.')
- let len = len(getline('.'))
- let equalprg = &l:equalprg
- try
- setlocal equalprg=
- silent normal! ==
- finally
- let &l:equalprg = equalprg
- let pos[2] += len(getline('.')) - len
- call setpos('.', pos)
- endtry
- endfunction"}}}
- function! neocomplete#helper#complete_configure() abort "{{{
- set completeopt-=menu
- set completeopt-=longest
- set completeopt+=menuone
- " Set options.
- let neocomplete = neocomplete#get_current_neocomplete()
- let neocomplete.completeopt = &completeopt
- if neocomplete#util#is_complete_select()
- \ && &completeopt !~# 'noinsert\|noselect'
- if g:neocomplete#enable_auto_select
- set completeopt-=noselect
- set completeopt+=noinsert
- else
- set completeopt-=noinsert
- set completeopt+=noselect
- endif
- endif
- endfunction"}}}
- function! neocomplete#helper#clean(directory) abort "{{{
- let directory = neocomplete#get_data_directory() .'/'.a:directory
- for file in split(glob(directory . '/*'), '\n')
- let orig = substitute(substitute(fnamemodify(file, ':t'),
- \ '=-', ':', 'g'), '=+', '/', 'g')
- if !filereadable(orig)
- call delete(file)
- endif
- endfor
- endfunction"}}}
- let &cpo = s:save_cpo
- unlet s:save_cpo
- " vim: foldmethod=marker
|