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.
This commit is contained in:
Fabian Homborg 2016-01-07 21:32:16 +01:00
parent fdb2559425
commit ed1919b266
2 changed files with 18 additions and 12 deletions

View file

@ -157,17 +157,19 @@ function __fish_abbr_parse_entry -S -a __input __key __value
if test -z "$__value" if test -z "$__value"
set __value __ set __value __
end end
switch $__input # A "=" _before_ any space - we only read the first possible separator
case "*=*" # because the key can contain neither spaces nor "="
if string match -qr '^[^ ]+=' -- $__input
# No need for bounds-checking because we already matched before # No need for bounds-checking because we already matched before
set -l KV (string split "=" -m 1 -- $__input) set -l KV (string split "=" -m 1 -- $__input)
set $__key $KV[1] set $__key $KV[1]
set $__value $KV[2] set $__value $KV[2]
case "* *" else if string match -qr '^[^ ]+ .*' -- $__input
set -l KV (string split " " -m 1 -- $__input) set -l KV (string split " " -m 1 -- $__input)
set $__key $KV[1] set $__key $KV[1]
set $__value $KV[2] set $__value $KV[2]
case "*" else
# This is needed for `erase` et al, where we want to allow passing a value
set $__key $__input set $__key $__input
end end
return 0 return 0

View file

@ -31,3 +31,7 @@ abbr -e '~__abbr2'
abbr -- '--__abbr3' 'xyz' abbr -- '--__abbr3' 'xyz'
abbr | grep __abbr3 abbr | grep __abbr3
abbr -e '--__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"