Skip to content

Commit

Permalink
Do not enable delayed expansion mode when running cmd.exe
Browse files Browse the repository at this point in the history
And simplify the argument escaping code. Fix #3764.

This may breaks some existing use cases, but the mode causes too much
trouble when escaping arguments and it makes some things not possible.

  # Now you can pass special characters to rg process without any escaping problems: &|<>()@^%!
  fzf --ansi --disabled --bind "change:reload:rg --column --line-number --no-heading --color=always --smart-case -- {q}"

  # No sudden expansion of the arguments on '!'
  fzf --disabled --preview "echo {q} {n} {}" --query "&|<>()@^%!" --prompt "&|<>()@^%!"
  • Loading branch information
junegunn committed May 6, 2024
1 parent 24ff66d commit 5669f48
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 15 deletions.
2 changes: 1 addition & 1 deletion man/man1/fzf.1
Original file line number Diff line number Diff line change
Expand Up @@ -821,7 +821,7 @@ e.g. \fBfzf --multi | fzf --sync\fR
.B "--with-shell=STR"
Shell command and flags to start child processes with. On *nix Systems, the
default value is \fB$SHELL -c\fR if \fB$SHELL\fR is set, otherwise \fBsh -c\fR.
On Windows, the default value is \fBcmd /v:on/s/c\fR when \fB$SHELL\fR is not
On Windows, the default value is \fBcmd /s/c\fR when \fB$SHELL\fR is not
set.

.RS
Expand Down
13 changes: 2 additions & 11 deletions plugin/fzf.vim
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,9 @@ if s:is_win
return iconv(a:str, &encoding, 'cp'.s:codepage)
endfunction
function! s:wrap_cmds(cmds)
return map([
\ '@echo off',
\ 'setlocal enabledelayedexpansion']
return map(['@echo off']
\ + (has('gui_running') ? ['set TERM= > nul'] : [])
\ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
\ + ['endlocal'],
\ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]),
\ '<SID>enc_to_cp(v:val."\r")')
endfunction
else
Expand All @@ -83,8 +80,6 @@ else
endfunction
endif

let s:cmd_control_chars = ['&', '|', '<', '>', '(', ')', '@', '^', '!']

function! s:shellesc_cmd(arg)
let e = '"'
let slashes = 0
Expand All @@ -94,10 +89,6 @@ function! s:shellesc_cmd(arg)
elseif c ==# '"'
let e .= repeat('\', slashes + 1)
let slashes = 0
elseif c ==# '%'
let e .= '%'
elseif index(s:cmd_control_chars, c) >= 0
let e .= '^'
else
let slashes = 0
endif
Expand Down
4 changes: 1 addition & 3 deletions src/util/util_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func NewExecutor(withShell string) *Executor {
args = args[1:]
} else if strings.HasPrefix(basename, "cmd") {
shellType = shellTypeCmd
args = []string{"/v:on/s/c"}
args = []string{"/s/c"}
} else if strings.HasPrefix(basename, "pwsh") || strings.HasPrefix(basename, "powershell") {
shellType = shellTypePowerShell
args = []string{"-NoProfile", "-Command"}
Expand Down Expand Up @@ -119,8 +119,6 @@ func escapeArg(s string) string {
slashes = 0
case '\\':
slashes++
case '&', '|', '<', '>', '(', ')', '@', '^', '%', '!':
b = append(b, '^')
case '"':
for ; slashes > 0; slashes-- {
b = append(b, '\\')
Expand Down

0 comments on commit 5669f48

Please sign in to comment.