2015-09-23 19:28:32 +08:00
function alias --description 'Legacy function for creating shellscript functions using an alias-like syntax'
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
2015-09-23 19:28:32 +08:00
set -l name
set -l body
set -l prefix
set -l first_word
switch ( count $argv )
2006-11-18 00:24:38 +08:00
2015-09-23 19:28:32 +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
case 1
set -l tmp ( string replace -r "=" '\n' -- $argv ) ""
set name $tmp [ 1 ]
set body $tmp [ 2 ]
2006-11-18 00:24:38 +08:00
2015-09-23 19:28:32 +08:00
case 2
set name $argv [ 1 ]
set body $argv [ 2 ]
2006-11-08 04:55:39 +08:00
2015-09-23 19:28:32 +08:00
case \*
printf ( _ "%s: Expected one or two arguments, got %d\n" ) alias ( count $argv )
return 1
end
2006-11-08 04:55:39 +08:00
2015-09-23 19:28:32 +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
2006-11-08 04:55:39 +08:00
2015-09-23 19:28:32 +08:00
# Extract the first command from the body
# This is supposed to replace all non-escaped (i.e. preceded by an odd number of `\`) spaces with a newline
# so it splits on them
set -l tmp ( string replace -ra "([^\\\ ])((\\\\\\\)*) " '$1\n' $body )
set first_word ( string trim $tmp [ 1 ] )
if set -q tmp [ 2 ]
set body $tmp [ 2 .. - 1 ]
else
set body
end
2006-11-08 04:55:39 +08:00
2015-09-23 19:28:32 +08:00
# Prevent the alias from immediately running into an infinite recursion if
# $body starts with the same command as $name.
2014-08-21 09:19:23 +08:00
2015-09-23 19:28:32 +08:00
if test $first_word = $name
if contains $name ( builtin --names )
set prefix builtin
else
set prefix command
2014-08-21 09:19:23 +08:00
end
2015-09-23 19:28:32 +08:00
end
eval " function $name --wraps $first_word ; $prefix $first_word $body \$argv; end "
2006-11-08 04:55:39 +08:00
end
2015-09-23 19:28:32 +08:00