2016-10-29 05:29:02 +00:00
|
|
|
function alias --description 'Creates a function wrapping a command'
|
2016-11-28 05:27:22 +00:00
|
|
|
if count $argv >/dev/null
|
2015-09-23 11:28:32 +00:00
|
|
|
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
|
|
|
|
2015-09-23 11:28:32 +00:00
|
|
|
set -l name
|
|
|
|
set -l body
|
|
|
|
set -l prefix
|
|
|
|
set -l first_word
|
2017-02-21 04:23:55 +00:00
|
|
|
set -l wrapped_cmd
|
2015-09-23 11:28:32 +00:00
|
|
|
switch (count $argv)
|
2006-11-17 16:24:38 +00:00
|
|
|
|
2015-09-23 11:28:32 +00:00
|
|
|
case 0
|
2016-10-29 05:29:02 +00:00
|
|
|
for func in (functions -n)
|
2016-10-31 08:37:23 +00:00
|
|
|
set -l output (functions $func | string match -r -- "function .* --description '(alias .*)'" | string split \n)
|
|
|
|
set -q output[2]
|
|
|
|
and echo $output[2]
|
2016-10-29 05:29:02 +00:00
|
|
|
end
|
|
|
|
return 0
|
2015-09-23 11:28:32 +00:00
|
|
|
case 1
|
2017-02-10 12:51:05 +00:00
|
|
|
set -l tmp (string split -m 1 "=" -- $argv) ""
|
2015-09-23 11:28:32 +00:00
|
|
|
set name $tmp[1]
|
|
|
|
set body $tmp[2]
|
2006-11-17 16:24:38 +00:00
|
|
|
|
2015-09-23 11:28:32 +00:00
|
|
|
case 2
|
|
|
|
set name $argv[1]
|
|
|
|
set body $argv[2]
|
2006-11-07 20:55:39 +00:00
|
|
|
|
2015-09-23 11:28:32 +00:00
|
|
|
case \*
|
|
|
|
printf ( _ "%s: Expected one or two arguments, got %d\n") alias (count $argv)
|
|
|
|
return 1
|
|
|
|
end
|
2006-11-07 20:55:39 +00:00
|
|
|
|
2015-09-23 11:28:32 +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
|
2006-11-07 20:55:39 +00:00
|
|
|
|
2017-02-21 04:23:55 +00: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. See issue #2220
|
|
|
|
# for why the following borderline incomprehensible code exists.
|
2016-09-01 10:27:10 +00:00
|
|
|
set -l tmp (string replace -ra "([^\\\ ])((\\\\\\\)*) " '$1\n' $body)
|
2015-09-23 11:28:32 +00:00
|
|
|
set first_word (string trim $tmp[1])
|
2017-02-21 04:23:55 +00:00
|
|
|
# If the user does something like `alias x 'foo; bar'` we need to strip the semicolon.
|
|
|
|
set wrapped_cmd (string trim -c ';' $first_word)
|
2015-09-23 11:28:32 +00:00
|
|
|
if set -q tmp[2]
|
|
|
|
set body $tmp[2..-1]
|
|
|
|
else
|
|
|
|
set body
|
|
|
|
end
|
2006-11-07 20:55:39 +00:00
|
|
|
|
2015-09-23 11:28:32 +00:00
|
|
|
# Prevent the alias from immediately running into an infinite recursion if
|
|
|
|
# $body starts with the same command as $name.
|
2017-02-21 04:23:55 +00:00
|
|
|
if test $wrapped_cmd = $name
|
2015-09-23 11:28:32 +00:00
|
|
|
if contains $name (builtin --names)
|
|
|
|
set prefix builtin
|
|
|
|
else
|
|
|
|
set prefix command
|
2014-08-21 01:19:23 +00:00
|
|
|
end
|
2015-09-23 11:28:32 +00:00
|
|
|
end
|
2016-10-31 08:37:23 +00:00
|
|
|
set -l cmd_string (string escape "alias $argv")
|
2017-02-21 04:23:55 +00:00
|
|
|
set wrapped_cmd (string escape $wrapped_cmd)
|
|
|
|
echo "function $name --wraps $wrapped_cmd --description $cmd_string; $prefix $first_word $body \$argv; end" | source
|
|
|
|
#echo "function $name --wraps $wrapped_cmd --description $cmd_string; $prefix $first_word $body \$argv; end"
|
2006-11-07 20:55:39 +00:00
|
|
|
end
|