123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- "=============================================================================
- " FILE: omni.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
- " Global options definition. "{{{
- let g:neocomplete#sources#omni#functions =
- \ get(g:, 'neocomplete#sources#omni#functions', {})
- let g:neocomplete#sources#omni#input_patterns =
- \ get(g:, 'neocomplete#sources#omni#input_patterns', {})
- "}}}
- let s:source = {
- \ 'name' : 'omni',
- \ 'kind' : 'manual',
- \ 'mark' : '[O]',
- \ 'rank' : 50,
- \ 'min_pattern_length' : 0,
- \ 'hooks' : {},
- \}
- let s:List = neocomplete#util#get_vital().import('Data.List')
- function! s:source.hooks.on_init(context) abort "{{{
- " Initialize omni completion pattern. "{{{
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'html,xhtml,xml,markdown,mkd',
- \'<\|\s[[:alnum:]-]*')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'css,scss,sass',
- \'\w\{' . g:neocomplete#min_keyword_length . '\}\|\w\+[):;]\s*\w*\|[@!]')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'javascript',
- \'[^. \t]\.\%(\h\w*\)\?')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'actionscript',
- \'[^. \t][.:]\h\w*')
- "call neocomplete#util#set_default_dictionary(
- "\'g:neocomplete#sources#omni#input_patterns',
- "\'php',
- "\'[^. \t]->\h\w*\|\h\w*::\w*')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'java',
- \'\%(\h\w*\|)\)\.\w*')
- "call neocomplete#util#set_default_dictionary(
- "\'g:neocomplete#sources#omni#input_patterns',
- "\'perl',
- "\'\h\w*->\h\w*\|\h\w*::\w*')
- "call neocomplete#util#set_default_dictionary(
- "\'g:neocomplete#sources#omni#input_patterns',
- "\'c',
- "\'[^.[:digit:] *\t]\%(\.\|->\)\w*'
- "call neocomplete#util#set_default_dictionary(
- "\'g:neocomplete#sources#omni#input_patterns',
- "\'cpp',
- "\'[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'objc',
- \'[^.[:digit:] *\t]\%(\.\|->\)\w*')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'objj',
- \'[\[ \.]\w\+$\|:\w*$')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'go',
- \'[^.[:digit:] *\t]\.\w*')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'clojure',
- \'\%(([^)]\+\)\|\*[[:alnum:]_-]\+')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'rust',
- \'[^.[:digit:] *\t]\%(\.\|\::\)\%(\h\w*\)\?')
- " External language interface check.
- if has('ruby')
- " call neocomplete#util#set_default_dictionary(
- "\'g:neocomplete#sources#omni#input_patterns', 'ruby',
- "\'[^. *\t]\.\h\w*\|\h\w*::\w*')
- endif
- if has('python') || has('python3')
- call neocomplete#util#set_default_dictionary(
- \'g:neocomplete#sources#omni#input_patterns',
- \'python', '[^. \t]\.\w*')
- endif
- "}}}
- endfunction"}}}
- function! s:source.get_complete_position(context) abort "{{{
- let a:context.source__complete_results =
- \ s:set_complete_results_pos(
- \ s:get_omni_funcs(a:context.filetype), a:context.input)
- return s:get_complete_pos(a:context.source__complete_results)
- endfunction"}}}
- function! s:source.gather_candidates(context) abort "{{{
- return s:get_candidates(
- \ s:set_complete_results_words(
- \ a:context.source__complete_results),
- \ a:context.complete_pos, a:context.complete_str)
- endfunction"}}}
- function! neocomplete#sources#omni#define() abort "{{{
- return s:source
- endfunction"}}}
- function! s:get_omni_funcs(filetype) abort "{{{
- let funcs = []
- for ft in insert(split(a:filetype, '\.'), '_')
- let omnifuncs = neocomplete#util#convert2list(
- \ get(g:neocomplete#sources#omni#functions, ft, &l:omnifunc))
- for omnifunc in omnifuncs
- if neocomplete#helper#check_invalid_omnifunc(omnifunc)
- " omnifunc is irregal.
- continue
- endif
- if get(g:neocomplete#sources#omni#input_patterns, omnifunc, '') != ''
- let pattern = g:neocomplete#sources#omni#input_patterns[omnifunc]
- elseif get(g:neocomplete#sources#omni#input_patterns, ft, '') != ''
- let pattern = g:neocomplete#sources#omni#input_patterns[ft]
- else
- let pattern = ''
- endif
- if pattern == ''
- continue
- endif
- call add(funcs, [omnifunc, pattern])
- endfor
- endfor
- return s:List.uniq(funcs)
- endfunction"}}}
- function! s:get_omni_list(list) abort "{{{
- let omni_list = []
- " Convert string list.
- for val in deepcopy(a:list)
- let dict = (type(val) == type('') ?
- \ { 'word' : val } : val)
- call add(omni_list, dict)
- unlet val
- endfor
- return omni_list
- endfunction"}}}
- function! s:set_complete_results_pos(funcs, cur_text) abort "{{{
- " Try omnifunc completion. "{{{
- let complete_results = {}
- for [omnifunc, pattern] in a:funcs
- if neocomplete#is_auto_complete()
- \ && (pattern == ''
- \ || a:cur_text !~# '\%(' . pattern . '\m\)$')
- continue
- endif
- " Save pos.
- let pos = getpos('.')
- try
- let complete_pos = call(omnifunc, [1, ''])
- catch
- call neocomplete#print_error(
- \ 'Error occurred calling omnifunction: ' . omnifunc)
- call neocomplete#print_error(v:throwpoint)
- call neocomplete#print_error(v:exception)
- let complete_pos = -1
- finally
- if getpos('.') != pos
- call setpos('.', pos)
- endif
- endtry
- if complete_pos < 0
- continue
- endif
- let complete_str = a:cur_text[complete_pos :]
- let complete_results[omnifunc] = {
- \ 'candidates' : [],
- \ 'complete_pos' : complete_pos,
- \ 'complete_str' : complete_str,
- \ 'omnifunc' : omnifunc,
- \}
- endfor
- "}}}
- return complete_results
- endfunction"}}}
- function! s:set_complete_results_words(complete_results) abort "{{{
- " Try source completion.
- for [omnifunc, result] in items(a:complete_results)
- if neocomplete#complete_check()
- return a:complete_results
- endif
- let pos = getpos('.')
- try
- let ret = call(omnifunc, [0, result.complete_str])
- let list = type(ret) == type(0) ? [] :
- \ type(ret) == type([]) ? ret : ret.words
- catch
- call neocomplete#print_error(
- \ 'Error occurred calling omnifunction: ' . omnifunc)
- call neocomplete#print_error(v:throwpoint)
- call neocomplete#print_error(v:exception)
- let list = []
- finally
- call setpos('.', pos)
- endtry
- let list = s:get_omni_list(list)
- let result.candidates = list
- endfor
- return a:complete_results
- endfunction"}}}
- function! s:get_complete_pos(complete_results) abort "{{{
- if empty(a:complete_results)
- return -1
- endif
- let complete_pos = col('.')
- for result in values(a:complete_results)
- if complete_pos > result.complete_pos
- let complete_pos = result.complete_pos
- endif
- endfor
- return complete_pos
- endfunction"}}}
- function! s:get_candidates(complete_results, complete_pos, complete_str) abort "{{{
- " Append prefix.
- let candidates = []
- for result in values(a:complete_results)
- if result.complete_pos > a:complete_pos
- let prefix = a:complete_str[: result.complete_pos
- \ - a:complete_pos - 1]
- for keyword in result.candidates
- let keyword.word = prefix . keyword.word
- endfor
- endif
- let candidates += result.candidates
- endfor
- return candidates
- endfunction"}}}
- let &cpo = s:save_cpo
- unlet s:save_cpo
- " vim: foldmethod=marker
|