From c070505edf618ebe157ccb0a1eeeb276b5899cff Mon Sep 17 00:00:00 2001 From: wsdjeg Date: Sat, 11 Mar 2017 00:47:57 +0800 Subject: [PATCH] Fix menu --- autoload/SpaceVim/api/cmdlinemenu.vim | 39 +++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/autoload/SpaceVim/api/cmdlinemenu.vim b/autoload/SpaceVim/api/cmdlinemenu.vim index bfb528299..70ad4b8fd 100644 --- a/autoload/SpaceVim/api/cmdlinemenu.vim +++ b/autoload/SpaceVim/api/cmdlinemenu.vim @@ -10,13 +10,30 @@ function! s:parseInput(char) abort endif endfunction +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 + function! s:parseItems(items) abort - let shortcuts = [] let items = {} + let g:items = items for item in a:items - if index(shortcuts, item[0:0]) == -1 - let items[item[0:0]] = '(' . item[0:0] . ')' . item[1:] - endif + let id = index(a:items, item) + 1 + let items[id] = '(' . id . ')' . item endfor return items endfunction @@ -25,16 +42,16 @@ function! s:menu(items) abort let saved_more = &more set nomore let items = s:parseItems(a:items) - let selected = values(items)[0][1:1] + let selected = 1 let exit = 0 let indent = repeat(' ', 7) while !exit let menu = "Cmdline menu: Use j/k/enter and the shortcuts indicated\n" - for line in values(items) - if line[1:1] == selected - let menu .= indent . '>' . line . "\n" + for id in keys(items) + if id == selected + let menu .= indent . '>' . items[id] . "\n" else - let menu .= indent . ' ' . line . "\n" + let menu .= indent . ' ' . items[id] . "\n" endif endfor echo menu[:-2] @@ -44,9 +61,9 @@ function! s:menu(items) abort elseif index(keys(items), nr2char(nr)) != -1 let selected = nr2char(nr) elseif nr2char(nr) ==# 'j' - let selected = keys(items)[index(keys(items), selected) + 1] + let selected = s:nextItem(keys(items), selected) elseif nr2char(nr) ==# 'k' - let selected = keys(items)[index(keys(items), selected) - 1] + let selected = s:previousItem(keys(items), selected) endif redraw endwhile