summaryrefslogtreecommitdiff
path: root/plugin/fzf.vim
diff options
context:
space:
mode:
authorJan Edmund Lazo <janedmundlazo@hotmail.com>2016-12-31 23:11:06 -0500
committerJunegunn Choi <junegunn.c@gmail.com>2017-01-02 02:16:25 +0900
commit6c0fd7f9ca663f2057a114f1aa86bfe5f6a78c68 (patch)
tree64dd05a0c2cf9f167ccd1c5fcd879a68045f2c0f /plugin/fzf.vim
parent42a2371d264b4f9b33d0e14847766c49b045df53 (diff)
downloadfzf-6c0fd7f9ca663f2057a114f1aa86bfe5f6a78c68.tar.gz
[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
Diffstat (limited to 'plugin/fzf.vim')
-rw-r--r--plugin/fzf.vim23
1 files 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))