1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-23 18:01:34 +08:00
SpaceVim/autoload/SpaceVim/plugins/help.vim
2018-01-05 01:17:56 +08:00

101 lines
2.5 KiB
VimL

let s:KEY = SpaceVim#api#import('vim#key')
let s:key_describ = {}
function! SpaceVim#plugins#help#describe_bindings()
endfunction
function! SpaceVim#plugins#help#regist_root(dict)
let keys = keys(a:dict)
if type(a:dict) == 4 && len(keys) == 1
call extend(s:key_describ, a:dict)
endif
endfunction
function! SpaceVim#plugins#help#describe_key()
let defined = 1
let root = s:key_describ
let prompt = 'Describe key:'
let keys = []
call s:build_mpt(prompt)
let key = getchar()
let char = s:KEY.nr2name(key)
if index(keys(g:_spacevim_mappings_prefixs), char) != -1
let name = SpaceVim#mapping#leader#getName(nr2char(key))
else
let name = char
endif
call add(keys, name)
if has_key(root, name)
let root = root[name]
if type(root) == 3
if len(root) == 3
redraw!
call s:open_describe_buffer(root[-1])
else
call s:build_mpt(['can not find describe for ', join(keys, ' - ')])
endif
let defined = 0
else
call s:build_mpt([prompt, join(keys + [''], ' - ')])
endif
else
redraw!
echohl Comment
echo join(keys, ' - ') . ' is undefined'
echohl NONE
let defined = 0
endif
while defined
let key = getchar()
let name = s:KEY.nr2name(key)
call add(keys, name)
if has_key(root, name)
let root = root[name]
if type(root) == 3
if len(root) == 3
redraw!
call s:open_describe_buffer(root[-1])
else
call s:build_mpt(['can not find describe for ', join(keys, ' - ')])
endif
let defined = 0
else
call s:build_mpt([prompt, join(keys + [''], ' - ')])
endif
else
redraw!
echohl Comment
echo join(keys, ' - ') . ' is undefined'
echohl NONE
let defined = 0
endif
endwhile
endfunction
function! s:build_mpt(mpt) abort
redraw!
echohl Comment
if type(a:mpt) == 1
echo a:mpt
elseif type(a:mpt) == 3
echo join(a:mpt)
endif
echohl NONE
endfunction
function! s:open_describe_buffer(desc) abort
noautocmd botright split __help_describe__
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nospell nonu norelativenumber nocursorline
set filetype=HelpDescribe
call setline(1, a:desc)
let b:defind_file_name = split(a:desc[-1][12:], ':')
let lines = &lines * 30 / 100
if lines < winheight(0)
exe 'resize ' . lines
endif
setlocal nofoldenable
nnoremap <buffer><silent> q :bd<cr>
endfunction