From 282884ad83c9aae32519d9bb3b7d685319c26639 Mon Sep 17 00:00:00 2001 From: bitraid Date: Tue, 11 Feb 2025 16:19:40 +0200 Subject: [PATCH] [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` --- shell/key-bindings.fish | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/shell/key-bindings.fish b/shell/key-bindings.fish index 9d173d48..8e316518 100644 --- a/shell/key-bindings.fish +++ b/shell/key-bindings.fish @@ -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 -- '(?