2016-10-29 13:29:02 +08:00
|
|
|
function alias --description 'Creates a function wrapping a command'
|
2020-03-10 02:36:12 +08:00
|
|
|
set -l options h/help s/save
|
2022-04-08 22:33:27 +08:00
|
|
|
argparse -n alias --max-args=2 $options -- $argv
|
2017-07-14 02:41:00 +08:00
|
|
|
or return
|
|
|
|
|
|
|
|
if set -q _flag_help
|
|
|
|
__fish_print_help alias
|
|
|
|
return 0
|
2015-09-23 19:28:32 +08:00
|
|
|
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
|
2006-11-18 00:24:38 +08:00
|
|
|
|
2017-07-14 02:41:00 +08:00
|
|
|
if not set -q argv[1]
|
|
|
|
# Print the known aliases.
|
|
|
|
for func in (functions -n)
|
2020-04-18 15:35:33 +08:00
|
|
|
set -l output (functions $func | string match -r -- "^function .* --description (?:'alias (.*)'|alias\\\\ (.*))\$")
|
2017-07-16 08:36:36 +08:00
|
|
|
if set -q output[2]
|
2023-06-17 13:46:07 +08:00
|
|
|
set output (string replace -r -- '^'(string escape --style=regex -- $func)'[= ]' '' $output[2])
|
2017-07-16 08:36:36 +08:00
|
|
|
echo alias $func (string escape -- $output[1])
|
|
|
|
end
|
2017-07-14 02:41:00 +08:00
|
|
|
end
|
|
|
|
return 0
|
|
|
|
else if not set -q argv[2]
|
|
|
|
# Alias definition of the form "name=value".
|
|
|
|
set -l tmp (string split -m 1 "=" -- $argv) ""
|
|
|
|
set name $tmp[1]
|
|
|
|
set body $tmp[2]
|
|
|
|
else
|
|
|
|
# Alias definition of the form "name value".
|
|
|
|
set name $argv[1]
|
|
|
|
set body $argv[2]
|
2015-09-23 19:28:32 +08:00
|
|
|
end
|
2006-11-08 04:55:39 +08:00
|
|
|
|
2015-09-23 19:28:32 +08:00
|
|
|
# sanity check
|
|
|
|
if test -z "$name"
|
2022-04-08 00:19:15 +08:00
|
|
|
printf ( _ "%s: name cannot be empty\n") alias >&2
|
2015-09-23 19:28:32 +08:00
|
|
|
return 1
|
|
|
|
else if test -z "$body"
|
2022-04-08 00:19:15 +08:00
|
|
|
printf ( _ "%s: body cannot be empty\n") alias >&2
|
2015-09-23 19:28:32 +08:00
|
|
|
return 1
|
|
|
|
end
|
2006-11-08 04:55:39 +08:00
|
|
|
|
2019-11-30 03:09:02 +08:00
|
|
|
# Extract the first command from the body.
|
2020-10-10 14:40:15 +08:00
|
|
|
printf '%s\n' $body | read -l --list words
|
2020-10-10 15:08:58 +08:00
|
|
|
set -l first_word $words[1]
|
|
|
|
set -l last_word $words[-1]
|
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.
|
2019-11-30 03:09:02 +08:00
|
|
|
if test $first_word = $name
|
2015-09-23 19:28:32 +08:00
|
|
|
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
|
2018-02-28 15:41:12 +08:00
|
|
|
set -l cmd_string (string escape -- "alias $argv")
|
2020-07-27 23:18:51 +08:00
|
|
|
|
2022-04-08 22:33:27 +08:00
|
|
|
# Do not define wrapper completion if we have "alias foo 'foo xyz'" or "alias foo 'sudo foo'"
|
|
|
|
# This is to prevent completions from recursively calling themselves (#7389).
|
|
|
|
# The latter will have rare false positives but it's more important to
|
|
|
|
# prevent recursion for this high-level command.
|
|
|
|
set -l wraps
|
|
|
|
if test $first_word != $name; and test $last_word != $name
|
|
|
|
set wraps --wraps (string escape -- $body)
|
|
|
|
end
|
2020-10-10 15:08:58 +08:00
|
|
|
|
2022-09-11 15:55:11 +08:00
|
|
|
echo "function $name $wraps --description $cmd_string; $prefix $body \$argv
|
|
|
|
end" | source # The function definition in split in two lines to ensure that a '#' can be put in the body.
|
2018-04-07 01:27:40 +08:00
|
|
|
if set -q _flag_save
|
|
|
|
funcsave $name
|
|
|
|
end
|
2006-11-08 04:55:39 +08:00
|
|
|
end
|