From 469ac6bfce292739bf805db75bfbbb2592f342db Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 20 Aug 2017 17:35:28 -0400 Subject: [PATCH 1/6] [Ag] works in Windows [fzf#vim#grep] use list type for options --- autoload/fzf/vim.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 9566365..468dc15 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -630,7 +630,7 @@ function! fzf#vim#ag(query, ...) let query = empty(a:query) ? '^(?=.)' : a:query let args = copy(a:000) let ag_opts = len(args) > 1 && type(args[0]) == s:TYPE.string ? remove(args, 0) : '' - let command = ag_opts . ' ' . shellescape(query) + let command = ag_opts . ' ' . fzf#shellescape(query) return call('fzf#vim#ag_raw', insert(args, command, 0)) endfunction @@ -654,9 +654,9 @@ function! fzf#vim#grep(grep_command, with_column, ...) let opts = { \ 'source': a:grep_command, \ 'column': a:with_column, - \ 'options': '--ansi --prompt "'.capname.'> " '. - \ '--multi --bind alt-a:select-all,alt-d:deselect-all '. - \ '--color hl:68,hl+:110' + \ 'options': ['--ansi', '--prompt', capname.'> ', + \ '--multi', '--bind', 'alt-a:select-all,alt-d:deselect-all', + \ '--color', 'hl:68,hl+:110'] \} function! opts.sink(lines) return s:ag_handler(a:lines, self.column) From 3334d62749f8e39de857e0d1a4f12505e57d7204 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 20 Aug 2017 21:21:32 -0400 Subject: [PATCH 2/6] [fzf#vim#with_preview] works with Ag in Windows - disabled on Files because the preview scripts cannot resolve the network drive - use 8.3 filepath for s:bin.preview to bypass escape issues in fzf binary --- autoload/fzf/vim.vim | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 468dc15..0e70c45 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -35,6 +35,15 @@ let s:bin = { \ 'preview': s:bin_dir.(executable('ruby') ? 'preview.rb' : 'preview.sh'), \ 'tags': s:bin_dir.'tags.pl' } let s:TYPE = {'dict': type({}), 'funcref': type(function('call')), 'string': type(''), 'list': type([])} +if s:is_win + if &shellslash + let s:bin.preview = fnamemodify(s:bin.preview, ':8') + else + set shellslash + let s:bin.preview = fnamemodify(s:bin.preview, ':8') + set noshellslash + endif +endif function! s:merge_opts(dict, eopts) if empty(a:eopts) @@ -64,9 +73,6 @@ function! fzf#vim#with_preview(...) let options = copy(args[0]) call remove(args, 0) endif - if s:is_win - return options - endif " Preview window if len(args) && type(args[0]) == s:TYPE.string @@ -199,6 +205,9 @@ function! s:fzf(name, opts, extra) let eopts = has_key(extra, 'options') ? remove(extra, 'options') : '' let merged = extend(copy(a:opts), extra) call s:merge_opts(merged, eopts) + if s:is_win && empty(get(merged, 'source', '')) && empty($FZF_DEFAULT_COMMAND) && get(merged, 'options', '') =~# s:bin.preview + return s:warn('preview script is incompatible with the default command in Windows') + endif return fzf#run(s:wrap(a:name, merged, bang)) endfunction From 057853a2480ccd98862e923abe57f82d966dc461 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 20 Aug 2017 21:42:09 -0400 Subject: [PATCH 3/6] [s:fzf] join the option list for preview script check --- autoload/fzf/vim.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 0e70c45..cc6f4d1 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -205,7 +205,8 @@ function! s:fzf(name, opts, extra) let eopts = has_key(extra, 'options') ? remove(extra, 'options') : '' let merged = extend(copy(a:opts), extra) call s:merge_opts(merged, eopts) - if s:is_win && empty(get(merged, 'source', '')) && empty($FZF_DEFAULT_COMMAND) && get(merged, 'options', '') =~# s:bin.preview + let mopts = get(merged, 'options', '') + if s:is_win && empty(get(merged, 'source', '')) && empty($FZF_DEFAULT_COMMAND) && (type(mopts) == s:TYPE.list ? join(mopts) : mopts) =~# s:bin.preview return s:warn('preview script is incompatible with the default command in Windows') endif return fzf#run(s:wrap(a:name, merged, bang)) From 71cc4c5037090fbfde5e1ecc42767afbed91d5b2 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 20 Aug 2017 22:42:45 -0400 Subject: [PATCH 4/6] Run preview script in batchfile for Windows Bypasses the following issues in Windows: 1. Neovim does not support 8.3 filenames ie. fnamemodify(path, ':8') 2. fzf binary cannot parse output of fzf#shellescape It assumes that preview command is run in sh, not cmd.exe --- autoload/fzf/vim.vim | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index cc6f4d1..7abd64f 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -35,15 +35,6 @@ let s:bin = { \ 'preview': s:bin_dir.(executable('ruby') ? 'preview.rb' : 'preview.sh'), \ 'tags': s:bin_dir.'tags.pl' } let s:TYPE = {'dict': type({}), 'funcref': type(function('call')), 'string': type(''), 'list': type([])} -if s:is_win - if &shellslash - let s:bin.preview = fnamemodify(s:bin.preview, ':8') - else - set shellslash - let s:bin.preview = fnamemodify(s:bin.preview, ':8') - set noshellslash - endif -endif function! s:merge_opts(dict, eopts) if empty(a:eopts) @@ -83,7 +74,17 @@ function! fzf#vim#with_preview(...) call remove(args, 0) endif - let preview = ['--preview-window', window, '--preview', s:bin.preview.' '.(window =~ 'up\|down' ? '-v' : '').' {}'] + if s:is_win + if exists('s:preview_script') + silent! call delete(s:preview_script) + endif + let s:preview_script = tempname().'.bat' + call writefile(['@echo off', fzf#shellescape(s:bin.preview).' %*'], s:preview_script) + let script = s:preview_script + else + let script = s:bin.preview + endif + let preview = ['--preview-window', window, '--preview', script.(window =~ 'up\|down' ? ' -v ' : ' ').'{}'] if len(args) call extend(preview, ['--bind', join(map(args, 'v:val.":toggle-preview"'), ',')]) From dda682ad6976ab8f08b62c1a5f8984873ceea13b Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 20 Aug 2017 22:55:47 -0400 Subject: [PATCH 5/6] Revert "Run preview script in batchfile for Windows" The reverted commit is broken. Keep it simple by sticking with the fnamemodify hack. Hope that Neovim supports 8.3 filenames --- autoload/fzf/vim.vim | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 7abd64f..cc6f4d1 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -35,6 +35,15 @@ let s:bin = { \ 'preview': s:bin_dir.(executable('ruby') ? 'preview.rb' : 'preview.sh'), \ 'tags': s:bin_dir.'tags.pl' } let s:TYPE = {'dict': type({}), 'funcref': type(function('call')), 'string': type(''), 'list': type([])} +if s:is_win + if &shellslash + let s:bin.preview = fnamemodify(s:bin.preview, ':8') + else + set shellslash + let s:bin.preview = fnamemodify(s:bin.preview, ':8') + set noshellslash + endif +endif function! s:merge_opts(dict, eopts) if empty(a:eopts) @@ -74,17 +83,7 @@ function! fzf#vim#with_preview(...) call remove(args, 0) endif - if s:is_win - if exists('s:preview_script') - silent! call delete(s:preview_script) - endif - let s:preview_script = tempname().'.bat' - call writefile(['@echo off', fzf#shellescape(s:bin.preview).' %*'], s:preview_script) - let script = s:preview_script - else - let script = s:bin.preview - endif - let preview = ['--preview-window', window, '--preview', script.(window =~ 'up\|down' ? ' -v ' : ' ').'{}'] + let preview = ['--preview-window', window, '--preview', s:bin.preview.' '.(window =~ 'up\|down' ? '-v' : '').' {}'] if len(args) call extend(preview, ['--bind', join(map(args, 'v:val.":toggle-preview"'), ',')]) From a4d4986d18074b7867584f837bc09cc37a110fd0 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Tue, 22 Aug 2017 06:02:22 -0400 Subject: [PATCH 6/6] Make 8.3 filename via cmd.exe for Neovim --- autoload/fzf/vim.vim | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index cc6f4d1..95cae03 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -36,13 +36,12 @@ let s:bin = { \ 'tags': s:bin_dir.'tags.pl' } let s:TYPE = {'dict': type({}), 'funcref': type(function('call')), 'string': type(''), 'list': type([])} if s:is_win - if &shellslash - let s:bin.preview = fnamemodify(s:bin.preview, ':8') + if has('nvim') + let s:bin.preview = split(system('for %A in ("'.s:bin.preview.'") do echo %~sA'), "\n")[1] else - set shellslash let s:bin.preview = fnamemodify(s:bin.preview, ':8') - set noshellslash endif + let s:bin.preview = escape(s:bin.preview, '\') endif function! s:merge_opts(dict, eopts)