diff options
Diffstat (limited to 'share/functions')
-rw-r--r-- | share/functions/alias.fish | 115 |
1 files changed, 55 insertions, 60 deletions
diff --git a/share/functions/alias.fish b/share/functions/alias.fish index 2dc86b1b..11fdd164 100644 --- a/share/functions/alias.fish +++ b/share/functions/alias.fish @@ -1,70 +1,65 @@ +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 -function alias --description "Legacy function for creating shellscript functions using an alias-like syntax" + set -l name + set -l body + set -l prefix + set -l first_word + switch (count $argv) - if count $argv >/dev/null - switch $argv[1] - case -h --h --he --hel --help - __fish_print_help alias - return 0 - end - end + 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] - set -l name - set -l body - set -l prefix - set -l first_word - switch (count $argv) + case 2 + set name $argv[1] + set body $argv[2] - 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 \* + printf ( _ "%s: Expected one or two arguments, got %d\n") alias (count $argv) + return 1 + end - case 2 - set name $argv[1] - set body $argv[2] + # 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 - case \* - printf ( _ "%s: Expected one or two arguments, got %d\n") alias (count $argv) - return 1 - end + # 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 - # 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 + # Prevent the alias from immediately running into an infinite recursion if + # $body starts with the same command as $name. - # 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 + if test $first_word = $name + if contains $name (builtin --names) + set prefix builtin + else + set prefix command 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 + eval "function $name --wraps $first_word; $prefix $first_word $body \$argv; end" end + |