Fix aliases with whitespace

And document how that stuff works.

Fixes #2220

Also, the string stuff is cool.
This commit is contained in:
Fabian Homborg 2015-09-23 13:28:32 +02:00
parent 6f92781992
commit 54d1d98e39
2 changed files with 67 additions and 66 deletions

View file

@ -18,6 +18,8 @@ alias NAME=DEFINITION
You cannot create an alias to a function with the same name. You cannot create an alias to a function with the same name.
Note that spaces need to be escaped in the call to alias just like in the commandline _even inside the quotes_.
\subsection alias-example Example \subsection alias-example Example
@ -31,4 +33,8 @@ alias rmi "rm -i"
function rmi function rmi
rm -i $argv rm -i $argv
end end
# This needs to have the spaces escaped or "Chrome.app..." will be seen as an argument to "/Applications/Google":
alias chrome='/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome banana'
\endfish \endfish

View file

@ -1,6 +1,4 @@
function alias --description 'Legacy function for creating shellscript functions using an alias-like syntax'
function alias --description "Legacy function for creating shellscript functions using an alias-like syntax"
if count $argv > /dev/null if count $argv > /dev/null
switch $argv[1] switch $argv[1]
case -h --h --he --hel --help case -h --h --he --hel --help
@ -19,12 +17,7 @@ function alias --description "Legacy function for creating shellscript functions
echo "Fish implements aliases using functions. Use 'functions' builtin to see list of functions and 'functions function_name' to see function definition, type 'help alias' for more information." echo "Fish implements aliases using functions. Use 'functions' builtin to see list of functions and 'functions function_name' to see function definition, type 'help alias' for more information."
return 1 return 1
case 1 case 1
# Some seds (e.g. on Mac OS X), don't support \n in the RHS set -l tmp (string replace -r "=" '\n' -- $argv) ""
# Use a literal newline instead
# http://sed.sourceforge.net/sedfaq4.html#s4.1
# The extra '' at the end is so $tmp[2] is guaranteed to work
set -l tmp (echo $argv|sed -e 's/\([^=]\{0,1\}\)=/\1\
/') ''
set name $tmp[1] set name $tmp[1]
set body $tmp[2] set body $tmp[2]
@ -47,12 +40,14 @@ function alias --description "Legacy function for creating shellscript functions
end end
# Extract the first command from the body # Extract the first command from the body
switch $body # This is supposed to replace all non-escaped (i.e. preceded by an odd number of `\`) spaces with a newline
case \*\ \* \*\t\* # so it splits on them
# note: strip leading spaces if present set -l tmp (string replace -ra "([^\\\ ])((\\\\\\\)*) " '$1\n' $body)
set first_word (echo $body|sed -e 's/^[[:space:]]\{1,\}//;s/[[:space:]].*//;q') set first_word (string trim $tmp[1])
case '*' if set -q tmp[2]
set first_word $body set body $tmp[2..-1]
else
set body
end end
# Prevent the alias from immediately running into an infinite recursion if # Prevent the alias from immediately running into an infinite recursion if
@ -65,6 +60,6 @@ function alias --description "Legacy function for creating shellscript functions
set prefix command set prefix command
end end
end end
eval "function $name --wraps $first_word; $prefix $first_word $body \$argv; end"
eval "function $name --wraps $first_word; $prefix $body \$argv; end"
end end