2006-11-08 04:55:39 +08:00
2007-01-16 09:29:18 +08:00
function alias --description "Legacy function for creating shellscript functions using an alias-like syntax"
2006-11-18 00:24:38 +08:00
if count $argv > /dev/null
switch $argv [ 1 ]
case -h --h --he --hel --help
__fish_print_help alias
return 0
end
end
2006-11-08 04:55:39 +08:00
set -l name
set -l body
2013-01-02 05:56:08 +08:00
set -l prefix
2014-08-21 09:19:23 +08:00
set -l first_word
2006-11-08 04:55:39 +08:00
switch ( count $argv )
2012-06-13 02:59:05 +08:00
case 0
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
2006-11-08 04:55:39 +08:00
case 1
2012-06-17 19:06:06 +08:00
# Some seds (e.g. on Mac OS X), don't support \n in the RHS
# Use a literal newline instead
# http://sed.sourceforge.net/sedfaq4.html#s4.1
2014-08-21 09:19:23 +08:00
# The extra '' at the end is so $tmp[2] is guaranteed to work
set -l tmp ( echo $argv | sed -e 's/\( [ ^ = ] \{ 0 ,1 \} \) = /\1 \
/') ' '
2006-11-08 04:55:39 +08:00
set name $tmp [ 1 ]
set body $tmp [ 2 ]
case 2
set name $argv [ 1 ]
set body $argv [ 2 ]
case \*
2007-04-12 19:52:21 +08:00
printf ( _ "%s: Expected one or two arguments, got %d\n" ) alias ( count $argv )
2006-11-08 04:55:39 +08:00
return 1
end
2014-08-21 09:19:23 +08:00
# sanity check
if test -z " $name "
printf ( _ "%s: Name cannot be empty\n" ) alias
return 1
else if test -z " $body "
printf ( _ "%s: Body cannot be empty\n" ) alias
return 1
end
# Extract the first command from the body
switch $body
case \* \ \* \* \t \*
# note: strip leading spaces if present
set first_word ( echo $body | sed -e 's/^[[:space:]]\{1,\}//;s/[[:space:]].*//;q' )
case '*'
set first_word $body
end
2013-02-06 03:43:40 +08:00
2013-02-20 05:58:55 +08:00
# Prevent the alias from immediately running into an infinite recursion if
# $body starts with the same command as $name.
2013-02-06 03:43:40 +08:00
2014-08-21 09:19:23 +08:00
if test $first_word = $name
if contains $name ( builtin --names )
set prefix builtin
else
set prefix command
end
2013-01-02 05:56:08 +08:00
end
2014-08-21 09:19:23 +08:00
eval " function $name --wraps $first_word ; $prefix $body \$argv; end "
2006-11-08 04:55:39 +08:00
end