mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 13:23:09 +00:00
61ce9db4ba
The new --wraps functionality was breaking aliases of the form `alias foo='bar baz'`. That is, aliases where the body is multiple words. Extract the first word of the body and use that instead. Use better errors for aliases with no name or no body.
70 lines
2.1 KiB
Fish
70 lines
2.1 KiB
Fish
|
|
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
|
|
|
|
set -l name
|
|
set -l body
|
|
set -l prefix
|
|
set -l first_word
|
|
switch (count $argv)
|
|
|
|
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
|
|
# 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
|
|
# 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 body $tmp[2]
|
|
|
|
case 2
|
|
set name $argv[1]
|
|
set body $argv[2]
|
|
|
|
case \*
|
|
printf ( _ "%s: Expected one or two arguments, got %d\n") alias (count $argv)
|
|
return 1
|
|
end
|
|
|
|
# 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
|
|
|
|
# Prevent the alias from immediately running into an infinite recursion if
|
|
# $body starts with the same command as $name.
|
|
|
|
if test $first_word = $name
|
|
if contains $name (builtin --names)
|
|
set prefix builtin
|
|
else
|
|
set prefix command
|
|
end
|
|
end
|
|
|
|
eval "function $name --wraps $first_word; $prefix $body \$argv; end"
|
|
end
|