From 3399e39968473b1920db19ef1969b9df34bdd3c1 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sat, 19 Aug 2017 23:28:36 -0400 Subject: [PATCH] [vim] Escape backslashes in fzf#shellescape (#1021) --- plugin/fzf.vim | 4 ++-- test/fzf.vader | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugin/fzf.vim b/plugin/fzf.vim index 9ce03c0..b08d0f6 100644 --- a/plugin/fzf.vim +++ b/plugin/fzf.vim @@ -66,8 +66,8 @@ function! s:shellesc_cmd(arg) let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g') let escaped = substitute(escaped, '%', '%%', 'g') let escaped = substitute(escaped, '"', '\\^&', 'g') - let escaped = substitute(escaped, '\\\+\(\\^\)', '\\\\\1', 'g') - return '^"'.substitute(escaped, '[^\\]\zs\\$', '\\\\', '').'^"' + let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g') + return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"' endfunction function! fzf#shellescape(arg, ...) diff --git a/test/fzf.vader b/test/fzf.vader index a1a6a2e..faa9418 100644 --- a/test/fzf.vader +++ b/test/fzf.vader @@ -149,16 +149,18 @@ Execute (fzf#wrap): Execute (fzf#shellescape with sh): AssertEqual '''''', fzf#shellescape('', 'sh') + AssertEqual '''\''', fzf#shellescape('\', 'sh') AssertEqual '''""''', fzf#shellescape('""', 'sh') AssertEqual '''foobar>''', fzf#shellescape('foobar>', 'sh') - AssertEqual '''\"''', fzf#shellescape('\"', 'sh') + AssertEqual '''\\\"\\\''', fzf#shellescape('\\\"\\\', 'sh') AssertEqual '''echo ''\''''a''\'''' && echo ''\''''b''\''''''', fzf#shellescape('echo ''a'' && echo ''b''', 'sh') Execute (fzf#shellescape with cmd.exe): AssertEqual '^"^"', fzf#shellescape('', 'cmd.exe') + AssertEqual '^"\\^"', fzf#shellescape('\', 'cmd.exe') AssertEqual '^"\^"\^"^"', fzf#shellescape('""', 'cmd.exe') AssertEqual '^"foobar^>^"', fzf#shellescape('foobar>', 'cmd.exe') - AssertEqual '^"\\\^"\\^"', fzf#shellescape('\\\\\\\\"\', 'cmd.exe') + AssertEqual '^"\\\\\\\^"\\\\\\^"', fzf#shellescape('\\\"\\\', 'cmd.exe') AssertEqual '^"echo ''a'' ^&^& echo ''b''^"', fzf#shellescape('echo ''a'' && echo ''b''', 'cmd.exe') AssertEqual '^"C:\Program Files ^(x86^)\\^"', fzf#shellescape('C:\Program Files (x86)\', 'cmd.exe')