1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-03-17 13:15:41 +08:00
SpaceVim/autoload/SpaceVim/api/cmdlinemenu.vim

97 lines
2.1 KiB
VimL
Raw Normal View History

2017-03-09 23:34:09 +08:00
let s:api = {}
function! s:parseInput(char) abort
if a:char == 27
return ''
else
return a:char
endif
endfunction
2017-03-11 00:47:57 +08:00
function! s:nextItem(list, item) abort
let id = index(a:list, a:item)
if id == len(a:list) - 1
return a:list[0]
else
return a:list[id + 1]
endif
endfunction
function! s:previousItem(list, item) abort
let id = index(a:list, a:item)
if id == 0
return a:list[len(a:list) - 1]
else
return a:list[id - 1]
endif
endfunction
2017-03-09 23:34:09 +08:00
function! s:parseItems(items) abort
let items = {}
for item in a:items
2017-03-11 00:47:57 +08:00
let id = index(a:items, item) + 1
2017-03-11 18:07:01 +08:00
let items[id] = ['(' . id . ')' . item[0], item[1]]
2017-03-09 23:34:09 +08:00
endfor
return items
endfunction
2017-03-11 18:07:01 +08:00
" items should be a list of [name, funcrc or string]
2017-03-09 23:34:09 +08:00
function! s:menu(items) abort
let saved_more = &more
set nomore
let items = s:parseItems(a:items)
let selected = '1'
2017-03-09 23:34:09 +08:00
let exit = 0
let indent = repeat(' ', 7)
while !exit
let menu = "Cmdline menu: Use j/k/enter and the shortcuts indicated\n"
2017-03-11 00:47:57 +08:00
for id in keys(items)
2017-03-11 18:07:01 +08:00
let m = items[id]
if type(m) == type([])
let m = m[0]
endif
2017-03-11 00:47:57 +08:00
if id == selected
2017-03-11 18:07:01 +08:00
let menu .= indent . '>' . items[id][0] . "\n"
2017-03-09 23:34:09 +08:00
else
2017-03-11 18:07:01 +08:00
let menu .= indent . ' ' . items[id][0] . "\n"
2017-03-09 23:34:09 +08:00
endif
endfor
echo menu[:-2]
let nr = getchar()
if s:parseInput(nr) ==# '' || nr == 3
let exit = 1
2017-03-11 18:07:01 +08:00
redraw
elseif index(keys(items), nr2char(nr)) != -1 && nr == 49
if nr != 49
let selected = nr2char(nr)
endif
let Value = items[selected][1]
redraw
if type(Value) == 2
call call(Value, [])
elseif type(Value) == type('') && !empty(Value)
execute Value
endif
let exit = 1
2017-03-09 23:34:09 +08:00
elseif nr2char(nr) ==# 'j'
2017-03-11 00:47:57 +08:00
let selected = s:nextItem(keys(items), selected)
2017-03-11 18:07:01 +08:00
redraw
2017-03-09 23:34:09 +08:00
elseif nr2char(nr) ==# 'k'
2017-03-11 00:47:57 +08:00
let selected = s:previousItem(keys(items), selected)
2017-03-11 18:07:01 +08:00
redraw
2017-03-09 23:34:09 +08:00
endif
endwhile
let &more = saved_more
endfunction
let s:api['menu'] = function('s:menu')
function! SpaceVim#api#cmdlinemenu#get() abort
return deepcopy(s:api)
endfunction
" vim:set et sw=2 cc=80: