diff options
author | Fabian Homborg <FHomborg@gmail.com> | 2016-01-07 21:32:16 +0100 |
---|---|---|
committer | Fabian Homborg <FHomborg@gmail.com> | 2016-01-14 16:58:29 +0100 |
commit | ed1919b266033ddea6781e78d637538398c5cfa2 (patch) | |
tree | 23bca89acbf68747ed3eb1652b11063482293847 | |
parent | fdb2559425d0838c0dc9c950949d8fdb2ae61024 (diff) |
abbr: Ensure we don't split on "=" if the given separator is " "
This fails on e.g. an abbr that uses `env a=b`, like the included test demonstrates.
Unfortunately it decreases the speed again (2s vs 2.2s vs 4s original),
but correctness is more important.
-rw-r--r-- | share/functions/abbr.fish | 26 | ||||
-rw-r--r-- | tests/abbr.in | 4 |
2 files changed, 18 insertions, 12 deletions
diff --git a/share/functions/abbr.fish b/share/functions/abbr.fish index 4a3c4d2b..e86ea559 100644 --- a/share/functions/abbr.fish +++ b/share/functions/abbr.fish @@ -157,18 +157,20 @@ function __fish_abbr_parse_entry -S -a __input __key __value if test -z "$__value" set __value __ end - switch $__input - case "*=*" - # No need for bounds-checking because we already matched before - set -l KV (string split "=" -m 1 -- $__input) - set $__key $KV[1] - set $__value $KV[2] - case "* *" - set -l KV (string split " " -m 1 -- $__input) - set $__key $KV[1] - set $__value $KV[2] - case "*" - set $__key $__input + # A "=" _before_ any space - we only read the first possible separator + # because the key can contain neither spaces nor "=" + if string match -qr '^[^ ]+=' -- $__input + # No need for bounds-checking because we already matched before + set -l KV (string split "=" -m 1 -- $__input) + set $__key $KV[1] + set $__value $KV[2] + else if string match -qr '^[^ ]+ .*' -- $__input + set -l KV (string split " " -m 1 -- $__input) + set $__key $KV[1] + set $__value $KV[2] + else + # This is needed for `erase` et al, where we want to allow passing a value + set $__key $__input end return 0 end diff --git a/tests/abbr.in b/tests/abbr.in index 69fdfb38..be828b08 100644 --- a/tests/abbr.in +++ b/tests/abbr.in @@ -31,3 +31,7 @@ abbr -e '~__abbr2' abbr -- '--__abbr3' 'xyz' abbr | grep __abbr3 abbr -e '--__abbr3' + +# Ensure we are not recognizing later "=" as separators +abbr d2 env a=b banana +abbr -l | string match -q d2; or echo "= test failed" |