From e2cb874ed1aee5ea9a75137e8bb262496e09a81d Mon Sep 17 00:00:00 2001
From: Wang Shidong <wsdjeg@outlook.com>
Date: Tue, 2 Apr 2019 22:57:20 +0800
Subject: [PATCH] Fix project switch function (#2718)

Add fzf menu support
---
 autoload/SpaceVim/layers/fzf.vim             | 36 ++++++++++++++++++++
 autoload/SpaceVim/plugins/projectmanager.vim | 13 ++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/autoload/SpaceVim/layers/fzf.vim b/autoload/SpaceVim/layers/fzf.vim
index ba8e29354..dfd8cdf7e 100644
--- a/autoload/SpaceVim/layers/fzf.vim
+++ b/autoload/SpaceVim/layers/fzf.vim
@@ -425,3 +425,39 @@ function! s:helptags(...) abort
         \   'down': '40%'
         \ }))
 endfunction
+
+
+" fzf menu command
+function! SpaceVim#layers#fzf#complete_menu(ArgLead, CmdLine, CursorPos) abort
+  return join(keys(g:unite_source_menu_menus), "\n")
+endfunction
+
+command! -nargs=* -complete=custom,SpaceVim#layers#fzf#complete_menu FzfMenu call <SID>menu(<q-args>)
+function! s:menu_action(e) abort
+  let action = get(s:menu_action, a:e, '')
+  exe action
+endfunction
+function! s:menu(name) abort
+  let s:source = 'menu'
+  let s:menu_name = a:name
+  let s:menu_action = {}
+  function! s:menu_content() abort
+    let menu = get(g:unite_source_menu_menus, s:menu_name, {})
+    if has_key(menu, 'command_candidates')
+      let rt = []
+      for item in menu.command_candidates
+        call add(rt, item[0])
+        call extend(s:menu_action, {item[0] : item[1]}, 'force')
+      endfor
+      return rt
+    else
+      return []
+    endif
+  endfunction
+  call fzf#run(fzf#wrap('menu', {
+        \   'source':  reverse(<sid>menu_content()),
+        \   'sink':    function('s:menu_action'),
+        \   'options': '+m',
+        \   'down': '40%'
+        \ }))
+endfunction
diff --git a/autoload/SpaceVim/plugins/projectmanager.vim b/autoload/SpaceVim/plugins/projectmanager.vim
index 76bd0f705..b3aee23e0 100644
--- a/autoload/SpaceVim/plugins/projectmanager.vim
+++ b/autoload/SpaceVim/plugins/projectmanager.vim
@@ -36,8 +36,19 @@ let g:unite_source_menu_menus.Projects = {'description':
 let g:unite_source_menu_menus.Projects.command_candidates =
       \ get(g:unite_source_menu_menus.Projects,'command_candidates', [])
 
+" this function will use fuzzy find layer, now only denite and unite are
+" supported.
+
 function! SpaceVim#plugins#projectmanager#list() abort
-  Unite menu:Projects
+  if SpaceVim#layers#isLoaded('unite')
+    Unite menu:Projects
+  elseif SpaceVim#layers#isLoaded('denite')
+    Denite menu:Projects
+  elseif SpaceVim#layers#isLoaded('fzf')
+    FzfMenu Projects
+  else
+    call SpaceVim#logger#warn('fuzzy find layer is needed to find project!')
+  endif
 endfunction
 
 function! SpaceVim#plugins#projectmanager#open(project) abort