2006-11-07 20:55:39 +00:00
2007-01-16 01:29:18 +00:00
function alias --description "Legacy function for creating shellscript functions using an alias-like syntax"
2006-11-17 16:24:38 +00: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-07 20:55:39 +00:00
set -l name
set -l body
2013-01-01 21:56:08 +00:00
set -l prefix
2014-08-21 01:19:23 +00:00
set -l first_word
2006-11-07 20:55:39 +00:00
switch ( count $argv )
2012-06-12 18:59:05 +00: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-07 20:55:39 +00:00
case 1
2012-06-17 11:06:06 +00: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 01:19:23 +00: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-07 20:55:39 +00:00
set name $tmp [ 1 ]
set body $tmp [ 2 ]
case 2
set name $argv [ 1 ]
set body $argv [ 2 ]
case \*
2007-04-12 11:52:21 +00:00
printf ( _ "%s: Expected one or two arguments, got %d\n" ) alias ( count $argv )
2006-11-07 20:55:39 +00:00
return 1
end
2014-08-21 01:19:23 +00: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-05 19:43:40 +00:00
2013-02-19 21:58:55 +00:00
# Prevent the alias from immediately running into an infinite recursion if
# $body starts with the same command as $name.
2013-02-05 19:43:40 +00:00
2014-08-21 01:19:23 +00:00
if test $first_word = $name
if contains $name ( builtin --names )
set prefix builtin
else
set prefix command
end
2013-01-01 21:56:08 +00:00
end
2014-08-21 01:19:23 +00:00
eval " function $name --wraps $first_word ; $prefix $body \$argv; end "
2006-11-07 20:55:39 +00:00
end