mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 00:40:05 +08:00
266 lines
9.1 KiB
VimL
266 lines
9.1 KiB
VimL
"=============================================================================
|
|
" FILE: neobundle_search.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
|
|
|
|
let s:Cache = unite#util#get_vital_cache()
|
|
|
|
function! unite#sources#neobundle_search#define() abort "{{{
|
|
" Init sources.
|
|
if !exists('s:neobundle_sources')
|
|
let s:neobundle_sources = {}
|
|
for define in map(split(globpath(&runtimepath,
|
|
\ 'autoload/neobundle/sources/*.vim', 1), '\n'),
|
|
\ "neobundle#sources#{fnamemodify(v:val, ':t:r')}#define()")
|
|
for dict in (type(define) == type([]) ? define : [define])
|
|
if !empty(dict) && !has_key(s:neobundle_sources, dict.name)
|
|
let s:neobundle_sources[dict.name] = dict
|
|
endif
|
|
endfor
|
|
unlet define
|
|
endfor
|
|
endif
|
|
|
|
return s:source
|
|
endfunction"}}}
|
|
|
|
let s:plugin_names = []
|
|
|
|
" Source rec.
|
|
let s:source = {
|
|
\ 'name' : 'neobundle/search',
|
|
\ 'description' : 'search plugins for neobundle',
|
|
\ 'hooks' : {},
|
|
\ 'action_table' : {},
|
|
\ 'default_action' : 'yank',
|
|
\ 'max_candidates' : 200,
|
|
\ 'syntax' : 'uniteSource__NeoBundleSearch',
|
|
\ 'parents' : ['uri'],
|
|
\ }
|
|
|
|
function! s:source.hooks.on_init(args, context) abort "{{{
|
|
let a:context.source__sources = copy(s:neobundle_sources)
|
|
if !empty(a:args)
|
|
let a:context.source__sources = filter(
|
|
\ a:context.source__sources,
|
|
\ 'index(a:args, v:key) >= 0')
|
|
endif
|
|
|
|
let a:context.source__input = a:context.input
|
|
if a:context.source__input == ''
|
|
let a:context.source__input =
|
|
\ unite#util#input('Please input search word: ', '',
|
|
\ 'customlist,unite#sources#neobundle_search#complete_plugin_names')
|
|
endif
|
|
endfunction"}}}
|
|
function! s:source.gather_candidates(args, context) abort "{{{
|
|
if neobundle#util#is_sudo()
|
|
call neobundle#util#print_error(
|
|
\ '"sudo vim" is detected. This feature is disabled.')
|
|
return []
|
|
endif
|
|
|
|
call unite#print_source_message('Search word: '
|
|
\ . a:context.source__input, s:source.name)
|
|
|
|
let candidates = []
|
|
let a:context.source__source_names = []
|
|
|
|
let s:plugin_names = []
|
|
|
|
for source in values(a:context.source__sources)
|
|
let source_candidates = source.gather_candidates(a:args, a:context)
|
|
let source_name = get(source, 'short_name', source.name)
|
|
for candidate in source_candidates
|
|
let candidate.source__source = source_name
|
|
if !has_key(candidate, 'source__script_type')
|
|
let candidate.source__script_type = ''
|
|
endif
|
|
if !has_key(candidate, 'source__description')
|
|
let candidate.source__description = ''
|
|
endif
|
|
endfor
|
|
|
|
let candidates += source_candidates
|
|
call add(a:context.source__source_names, source_name)
|
|
|
|
let s:plugin_names += map(copy(source_candidates), 'v:val.source__name')
|
|
endfor
|
|
|
|
call s:initialize_plugin_names(a:context)
|
|
|
|
return filter(candidates,
|
|
\ 'stridx(v:val.word, a:context.source__input) >= 0')
|
|
endfunction"}}}
|
|
|
|
function! s:source.complete(args, context, arglead, cmdline, cursorpos) abort "{{{
|
|
let arglead = get(a:args, -1, '')
|
|
return filter(keys(s:neobundle_sources),
|
|
\ "stridx(v:val, arglead) == 0")
|
|
endfunction"}}}
|
|
|
|
function! s:source.hooks.on_syntax(args, context) abort "{{{
|
|
syntax match uniteSource__NeoBundleSearch_DescriptionLine
|
|
\ / -- .*$/
|
|
\ contained containedin=uniteSource__NeoBundleSearch
|
|
syntax match uniteSource__NeoBundleSearch_Description
|
|
\ /.*$/
|
|
\ contained containedin=uniteSource__NeoBundleSearch_DescriptionLine
|
|
syntax match uniteSource__NeoBundleSearch_Marker
|
|
\ / -- /
|
|
\ contained containedin=uniteSource__NeoBundleSearch_DescriptionLine
|
|
syntax match uniteSource__NeoBundleSearch_Install
|
|
\ / Installed /
|
|
\ contained containedin=uniteSource__NeoBundleSearch
|
|
highlight default link uniteSource__NeoBundleSearch_Install Statement
|
|
highlight default link uniteSource__NeoBundleSearch_Marker Special
|
|
highlight default link uniteSource__NeoBundleSearch_Description Comment
|
|
endfunction"}}}
|
|
|
|
" Actions "{{{
|
|
let s:source.action_table.yank = {
|
|
\ 'description' : 'yank plugin settings',
|
|
\ 'is_selectable' : 1,
|
|
\ }
|
|
function! s:source.action_table.yank.func(candidates) abort "{{{
|
|
let @" = join(map(a:candidates,
|
|
\ "'NeoBundle ' . s:get_neobundle_args(v:val)"), "\n")
|
|
if has('clipboard')
|
|
call setreg(v:register, @")
|
|
endif
|
|
|
|
echo 'Yanked plugin settings!'
|
|
endfunction"}}}
|
|
|
|
let s:source.action_table.install = {
|
|
\ 'description' : 'direct install plugins',
|
|
\ 'is_selectable' : 1,
|
|
\ 'is_quit' : 0,
|
|
\ }
|
|
function! s:source.action_table.install.func(candidates) abort "{{{
|
|
for candidate in a:candidates
|
|
execute 'NeoBundleDirectInstall' s:get_neobundle_args(candidate)
|
|
endfor
|
|
endfunction"}}}
|
|
"}}}
|
|
|
|
" Filters "{{{
|
|
function! s:source.source__sorter(candidates, context) abort "{{{
|
|
return s:sort_by(a:candidates, 'v:val.source__name')
|
|
endfunction"}}}
|
|
function! s:source.source__converter(candidates, context) abort "{{{
|
|
let max_plugin_name = max(map(copy(a:candidates),
|
|
\ 'len(v:val.source__name)'))
|
|
let max_script_type = max(map(copy(a:candidates),
|
|
\ 'len(v:val.source__script_type)'))
|
|
let max_source_name = max(map(copy(a:context.source__source_names),
|
|
\ 'len(v:val)'))
|
|
let format = '%-'. max_plugin_name .'s %-'.
|
|
\ max_source_name .'s %-'. max_script_type .'s -- %s'
|
|
|
|
for candidate in a:candidates
|
|
let candidate.abbr = printf(format,
|
|
\ candidate.source__name, candidate.source__source,
|
|
\ candidate.source__script_type,
|
|
\ (neobundle#is_installed(candidate.source__name) ?
|
|
\ 'Installed' : candidate.source__description))
|
|
let candidate.is_multiline = 1
|
|
let candidate.kind =
|
|
\ get(candidate, 'action__path', '') != '' ?
|
|
\ 'file' : 'common'
|
|
endfor
|
|
|
|
return a:candidates
|
|
endfunction"}}}
|
|
|
|
let s:source.sorters = s:source.source__sorter
|
|
let s:source.converters = s:source.source__converter
|
|
"}}}
|
|
|
|
" Misc. "{{{
|
|
function! s:sort_by(list, expr) abort
|
|
let pairs = map(a:list, printf('[v:val, %s]', a:expr))
|
|
return map(s:sort(pairs,
|
|
\ 'a:a[1] == a:b[1] ? 0 : a:a[1] > a:b[1] ? 1 : -1'), 'v:val[0]')
|
|
endfunction
|
|
|
|
" Sorts a list with expression to compare each two values.
|
|
" a:a and a:b can be used in {expr}.
|
|
function! s:sort(list, expr) abort
|
|
if type(a:expr) == type(function('function'))
|
|
return sort(a:list, a:expr)
|
|
endif
|
|
let s:expr = a:expr
|
|
return sort(a:list, 's:_compare')
|
|
endfunction
|
|
|
|
function! s:_compare(a, b) abort
|
|
return eval(s:expr)
|
|
endfunction
|
|
|
|
function! s:get_neobundle_args(candidate) abort
|
|
return string(substitute(a:candidate.source__path,
|
|
\ '^https://github.com/', '', ''))
|
|
\ . (empty(a:candidate.source__options) ?
|
|
\ '' : ', ' . string(a:candidate.source__options))
|
|
\ . (a:candidate.source__description == '' ? '' :
|
|
\ ' " ' . a:candidate.source__description)
|
|
endfunction
|
|
|
|
function! unite#sources#neobundle_search#complete_plugin_names(arglead, cmdline, cursorpos) abort "{{{
|
|
return filter(s:get_plugin_names(), "stridx(v:val, a:arglead) == 0")
|
|
endfunction"}}}
|
|
|
|
function! s:initialize_plugin_names(context) abort "{{{
|
|
let cache_dir = neobundle#get_neobundle_dir() . '/.neobundle'
|
|
let path = 'plugin_names'
|
|
|
|
if a:context.is_redraw || !s:Cache.filereadable(cache_dir, path)
|
|
" Convert cache data.
|
|
call s:Cache.writefile(cache_dir, path, [string(s:plugin_names)])
|
|
endif
|
|
|
|
return s:get_plugin_names()
|
|
endfunction"}}}
|
|
|
|
function! s:get_plugin_names() abort "{{{
|
|
let cache_dir = neobundle#get_neobundle_dir() . '/.neobundle'
|
|
let path = 'plugin_names'
|
|
|
|
if empty(s:plugin_names) && s:Cache.filereadable(cache_dir, path)
|
|
sandbox let s:plugin_names =
|
|
\ eval(get(s:Cache.readfile(cache_dir, path), 0, '[]'))
|
|
endif
|
|
|
|
return neobundle#util#uniq(s:plugin_names)
|
|
endfunction"}}}
|
|
"}}}
|
|
|
|
let &cpo = s:save_cpo
|
|
unlet s:save_cpo
|
|
|
|
" vim: foldmethod=marker
|