From 3e91c189aea13472ee1f2757482507c24b9e1ff5 Mon Sep 17 00:00:00 2001
From: Junegunn Choi <junegunn.c@gmail.com>
Date: Fri, 27 Jun 2014 21:03:25 +0900
Subject: [PATCH] [vim] Defer `type fzf` to reduce startup time

---
 plugin/fzf.vim | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/plugin/fzf.vim b/plugin/fzf.vim
index 919c3f0a..42c89fca 100644
--- a/plugin/fzf.vim
+++ b/plugin/fzf.vim
@@ -25,22 +25,27 @@ let s:min_tmux_width  = 10
 let s:min_tmux_height = 3
 let s:default_tmux_height = '40%'
 let s:launcher = 'xterm -e bash -ic %s'
+let s:fzf_rb = expand('<sfile>:h:h').'/fzf'
 
 let s:cpo_save = &cpo
 set cpo&vim
 
-call system('type fzf')
-if v:shell_error
-  let s:fzf_rb = expand('<sfile>:h:h').'/fzf'
-  if executable(s:fzf_rb)
-    let s:exec = s:fzf_rb
+function! s:fzf_exec()
+  if !exists('s:exec')
+    call system('type fzf')
+    if v:shell_error
+      let s:exec = executable(s:fzf_rb) ? s:fzf_rb : ''
+    else
+      let s:exec = 'fzf'
+    endif
+    return s:fzf_exec()
+  elseif empty(s:exec)
+    unlet s:exec
+    throw 'fzf executable not found'
   else
-    echoerr 'fzf executable not found'
-    finish
+    return s:exec
   endif
-else
-  let s:exec = 'fzf'
-endif
+endfunction
 
 function! s:tmux_enabled()
   if has('gui_running')
@@ -71,6 +76,11 @@ function! fzf#run(...) abort
   let dict   = exists('a:1') ? a:1 : {}
   let temps  = { 'result': tempname() }
   let optstr = get(dict, 'options', '')
+  try
+    let fzf_exec = s:fzf_exec()
+  catch
+    throw v:exception
+  endtry
 
   if has_key(dict, 'source')
     let source = dict.source
@@ -87,7 +97,7 @@ function! fzf#run(...) abort
   else
     let prefix = ''
   endif
-  let command = prefix.s:exec.' '.optstr.' > '.temps.result
+  let command = prefix.fzf_exec.' '.optstr.' > '.temps.result
 
   if s:tmux_enabled() && s:tmux_splittable(dict)
     return s:execute_tmux(dict, command, temps)
-- 
GitLab