mirror of
https://github.com/junegunn/fzf.git
synced 2025-08-02 21:22:01 -07:00
[fish] Unescape query from commandline (#4236)
More natural processing of the query taken from command line, by unquoting/unescaping the token. Unescaped open quotes are removed. Because of how `string unescape` works, if both single and double quotes are present, with the outer quotes open, only the outer quotes are removed. Examples: `'foo bar'`, `"foo bar"`, `foo\ bar` becomes `foo bar` `"foobar`, `'foobar`, `foo"bar`, `foo'bar` becomes `foobar` `'"foo"'`, `'"foo"` becomes `"foo"` `"'foo'"`, `"'foo'` becomes `'foo'` `"'foo` becomes `'foo` `'"foo` becomes `"foo`
This commit is contained in:
@@ -154,8 +154,8 @@ function fzf_key_bindings
|
||||
# eval is used to do shell expansion on paths
|
||||
eval set commandline $commandline
|
||||
|
||||
# Combine multiple consecutive slashes into one
|
||||
set commandline (string replace -r -a -- '/+' '/' $commandline)
|
||||
# Combine multiple consecutive slashes into one, and unescape.
|
||||
set commandline (string replace -r -a -- '/+' '/' $commandline | string unescape -n)
|
||||
|
||||
if test -z "$commandline"
|
||||
# Default to current directory with no --query
|
||||
@@ -171,10 +171,8 @@ function fzf_key_bindings
|
||||
# if $dir is "." but commandline is not a relative path, this means no file path found
|
||||
set fzf_query $commandline
|
||||
else
|
||||
# Special characters must be double escaped.
|
||||
set -l re_dir (string escape -n -- $dir)
|
||||
# Also remove trailing slash after dir, to "split" input properly
|
||||
set fzf_query (string replace -r -- "^$re_dir/?" '' $commandline)
|
||||
set fzf_query (string replace -r -- "^$dir/?" '' $commandline)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -184,7 +182,7 @@ function fzf_key_bindings
|
||||
end
|
||||
|
||||
function __fzf_get_dir -d 'Find the longest existing filepath from input string'
|
||||
set dir (string unescape -n -- $argv)
|
||||
set dir $argv
|
||||
|
||||
# Strip trailing slash, unless $dir is root dir (/)
|
||||
set dir (string replace -r -- '(?<!^)/$' '' $dir)
|
||||
|
Reference in New Issue
Block a user