function __fish_maybe_list_all_functions
    # if the current commandline token starts with an _, list all functions
    if string match -qr -- '^_' (commandline -ct)
        functions -an
    else
        functions -n
    end
end

complete -c functions -s e -l erase -d "Erase function" -x -a "(__fish_maybe_list_all_functions)"
complete -c functions -xa "(functions -na)" -d Function
complete -c functions -s a -l all -d "Show hidden functions"
complete -c functions -s h -l help -d "Display help and exit"
complete -c functions -s d -l description -d "Set function description" -x
complete -c functions -s q -l query -d "Test if function is defined"
complete -c functions -s n -l names -d "List the names of the functions, but not their definition"
complete -c functions -s c -l copy -d "Copy the specified function to the specified new name"
complete -c functions -s D -l details -d "Display information about the function"
complete -c functions -s v -l verbose -d "Print more output"
complete -c functions -s H -l handlers -d "Show event handlers"
complete -c functions -s t -l handlers-type -d "Show event handlers matching the given type" -x -a "signal variable exit job-id generic"
complete -c functions -l color -d 'When to colorize output' -x -a 'always never auto'
