mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 19:50:04 +08:00
102 lines
2.7 KiB
VimL
102 lines
2.7 KiB
VimL
|
let s:Cache = vital#gina#import('System.Cache.Memory')
|
||
|
let s:Path = vital#gina#import('System.Filepath')
|
||
|
|
||
|
|
||
|
function! gina#complete#common#opener(arglead, cmdline, cursorpos) abort
|
||
|
if a:arglead !~# '^--opener='
|
||
|
return []
|
||
|
endif
|
||
|
let candidates = [
|
||
|
\ 'split',
|
||
|
\ 'vsplit',
|
||
|
\ 'tabedit',
|
||
|
\ 'pedit',
|
||
|
\]
|
||
|
let prefix = '--opener='
|
||
|
return gina#util#filter(a:arglead, map(candidates, 'prefix . v:val'))
|
||
|
endfunction
|
||
|
|
||
|
function! gina#complete#common#treeish(arglead, cmdline, cursorpos) abort
|
||
|
if a:arglead =~# '^[^:]*:'
|
||
|
let revision = matchstr(a:arglead, '^[^:]*\ze:')
|
||
|
let candidates = gina#complete#filename#tracked(
|
||
|
\ matchstr(a:arglead, '^[^:]*:\zs.*'),
|
||
|
\ a:cmdline,
|
||
|
\ a:cursorpos,
|
||
|
\ revision,
|
||
|
\)
|
||
|
return map(candidates, 'revision . '':'' . v:val')
|
||
|
else
|
||
|
let candidates = gina#complete#range#any(a:arglead, a:cmdline, a:cursorpos)
|
||
|
return map(candidates, 'v:val . '':''')
|
||
|
endif
|
||
|
endfunction
|
||
|
|
||
|
function! gina#complete#common#command(arglead, cmdline, cursorpos) abort
|
||
|
let cache = s:get_cache()
|
||
|
if !cache.has('command_names')
|
||
|
call cache.set('command_names', s:get_command_names())
|
||
|
endif
|
||
|
let command_names = cache.get('command_names')
|
||
|
return gina#util#filter(a:arglead, command_names, '^_')
|
||
|
endfunction
|
||
|
|
||
|
function! gina#complete#common#raw_command(arglead, cmdline, cursorpos) abort
|
||
|
return gina#util#filter(a:arglead, [
|
||
|
\ 'add',
|
||
|
\ 'bisect',
|
||
|
\ 'branch',
|
||
|
\ 'checkout',
|
||
|
\ 'clone',
|
||
|
\ 'commit',
|
||
|
\ 'diff',
|
||
|
\ 'fetch',
|
||
|
\ 'grep',
|
||
|
\ 'init',
|
||
|
\ 'log',
|
||
|
\ 'merge',
|
||
|
\ 'mv',
|
||
|
\ 'pull',
|
||
|
\ 'push',
|
||
|
\ 'rebase',
|
||
|
\ 'reset',
|
||
|
\ 'restore',
|
||
|
\ 'rm',
|
||
|
\ 'show',
|
||
|
\ 'status',
|
||
|
\ 'switch',
|
||
|
\ 'tag',
|
||
|
\])
|
||
|
endfunction
|
||
|
|
||
|
function! gina#complete#common#remote(arglead, cmdline, cursorpos) abort
|
||
|
let git = gina#core#get_or_fail()
|
||
|
let result = gina#process#call(git, ['remote'])
|
||
|
if result.status
|
||
|
return []
|
||
|
endif
|
||
|
return gina#util#filter(a:arglead, result.stdout)
|
||
|
endfunction
|
||
|
|
||
|
" Private --------------------------------------------------------------------
|
||
|
function! s:get_cache() abort
|
||
|
if exists('s:cache')
|
||
|
return s:cache
|
||
|
endif
|
||
|
let s:cache = s:Cache.new()
|
||
|
return s:cache
|
||
|
endfunction
|
||
|
|
||
|
function! s:get_command_names() abort
|
||
|
let suffix = s:Path.realpath('autoload/gina/command/*.vim')
|
||
|
let command_names = []
|
||
|
for runtimepath in split(&runtimepath, ',')
|
||
|
let names = map(
|
||
|
\ glob(s:Path.join(runtimepath, suffix), 0, 1),
|
||
|
\ 'matchstr(fnamemodify(v:val, '':t''), ''^.\+\ze\.vim$'')',
|
||
|
\)
|
||
|
call extend(command_names, names)
|
||
|
endfor
|
||
|
return sort(command_names)
|
||
|
endfunction
|