From 6c0fd7f9ca663f2057a114f1aa86bfe5f6a78c68 Mon Sep 17 00:00:00 2001
From: Jan Edmund Lazo <janedmundlazo@hotmail.com>
Date: Sat, 31 Dec 2016 23:11:06 -0500
Subject: [PATCH] [vim] FZF command to handle Windows paths with spaces

- Use noshellslash for strict path expansion in fzf#run and s:cmd
  (shellescape depends on shellslash)
- Double-quote the fzf command for cmd.exe
- Add fzf#shellescape to encapsulate the logic
- Close #786
---
 plugin/fzf.vim | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/plugin/fzf.vim b/plugin/fzf.vim
index a873a0ce..819a6c92 100644
--- a/plugin/fzf.vim
+++ b/plugin/fzf.vim
@@ -237,6 +237,19 @@ function! fzf#wrap(...)
   return opts
 endfunction
 
+function! fzf#shellescape(path)
+  if has('win32') || has('win64')
+    let shellslash = &shellslash
+    try
+      set noshellslash
+      return shellescape(a:path)
+    finally
+      let &shellslash = shellslash
+    endtry
+  endif
+  return shellescape(a:path)
+endfunction
+
 function! fzf#run(...) abort
 try
   let oshell = &shell
@@ -244,7 +257,7 @@ try
 
   if has('win32') || has('win64')
     set shell=cmd.exe
-    set shellslash
+    set noshellslash
   else
     set shell=sh
   endif
@@ -398,6 +411,8 @@ function! s:execute(dict, command, temps) abort
     let fmt = type(Launcher) == 2 ? call(Launcher, []) : Launcher
     if has('unix')
       let escaped = "'".substitute(escaped, "'", "'\"'\"'", 'g')."'"
+    elseif has('win32') || has('win64')
+      let escaped = '"'.(escaped).'"'
     endif
     let command = printf(fmt, escaped)
   else
@@ -615,10 +630,10 @@ function! s:cmd(bang, ...) abort
   let args = copy(a:000)
   let opts = { 'options': '--multi ' }
   if len(args) && isdirectory(expand(args[-1]))
-    let opts.dir = substitute(substitute(remove(args, -1), '\\\(["'']\)', '\1', 'g'), '/*$', '/', '')
-    let opts.options .= ' --prompt '.shellescape(opts.dir)
+    let opts.dir = substitute(substitute(remove(args, -1), '\\\(["'']\)', '\1', 'g'), '[/\\]*$', '/', '')
+    let opts.options .= ' --prompt '.fzf#shellescape(opts.dir)
   else
-    let opts.options .= ' --prompt '.shellescape(s:shortpath())
+    let opts.options .= ' --prompt '.fzf#shellescape(s:shortpath())
   endif
   let opts.options .= ' '.join(args)
   call fzf#run(fzf#wrap('FZF', opts, a:bang))
-- 
GitLab