diff --git a/share/functions/funced.fish b/share/functions/funced.fish new file mode 100644 index 000000000..3e58548de --- /dev/null +++ b/share/functions/funced.fish @@ -0,0 +1,39 @@ + +function funced --description "Edit function definition" + if test (count $argv) = 1 + switch $argv + + case '-h' '--h' '--he' '--hel' '--help' + __fish_print_help funced + return 0 + + case '-*' + printf (_ "%s: Unknown option %s\n") funced $argv + return 1 + + case '*' + set -l init '' + set -l tmp + + # Shadow IFS here to avoid array splitting in command substitution + set -l IFS + if functions -q $argv + set init (functions $argv | fish_indent --no-indent) + end + + + set -l prompt 'printf "%s%s%s> " (set_color green) '$argv' (set_color normal)' + # Unshadow IFS since the fish_title breaks otherwise + set -e IFS + if read -p $prompt -c "$init" -s cmd + # Shadow IFS _again_ to avoid array splitting in command substitution + set -l IFS + eval (echo -n $cmd | fish_indent) + end + return 0 + end + else + printf (_ '%s: Expected exactly one argument, got %s.\n\nSynopsis:\n\t%sfunced%s FUNCTION\n') funced (count $argv) (set_color $fish_color_command) (set_color $fish_color_normal) + end +end +