Как удалить функции из Fishshell, не удаляя напрямую файл функции?

Я определил функцию hello в Fishshell:

function hello
    echo Hello
end

И сохраните это:

funcsave hello

Если я хочу удалить его, я могу удалить файл ~/.config/fish/functions/hello.fish.

Есть ли другой способ сделать это? (как встроенный funcdel или funcrm)


person Freewind    schedule 18.04.2016    source источник


Ответы (5)


Нет, встроенной программы для удаления файла нет, но вы можете использовать:

functions --erase hello

or

functions -e hello

чтобы удалить определение функции из текущего сеанса.

Смотрите также

person glenn jackman    schedule 18.04.2016

Я создал для этого еще одну рыбную функцию

function funcdel
    if test -e ~/.config/fish/functions/$argv[1].fish
        rm ~/.config/fish/functions/$argv[1].fish
        echo 'Deleted function ' $argv[1]
    else
        echo 'Not found function ' $argv[1]
    end
end
person Kanzee    schedule 10.01.2018

Приведенное выше решение functions -e hello удаляет только hello в текущем сеансе. Откройте другой терминал, и функция все еще там.

Чтобы удалить функцию постоянным способом, мне пришлось прибегнуть к удалению файла ~/.config/fish/functions/hello.fish напрямую. До сих пор я не знаю другого способа постоянного удаления.

person qzhangjhu    schedule 16.07.2017
comment
Спасибо. Я не уверен, почему об этом больше нигде не упоминается? - person mdomino; 29.10.2020

более полное, самоопределяемое (и тихое) самодельное решение, вдохновленное ответом @Kanzee (скопируйте в файл ~/.config/fish/functions/funcdel.fish):

function funcdel --description 'Deletes a fish function both permanently and from memory'
    set -l fun_name $argv[1]
    set -l fun_file ~/.config/fish/functions/$fun_name.fish

    # Delete the in-memory function, if it exists
    functions --erase $fun_name

    # Delete the function permanently,
    # if it exists as a file in the regular location
    if test -e $fun_file
        rm $fun_file
    end
end
person hoijui    schedule 27.02.2018

Я объединил ответ от @hoijui с некоторым кодом из функции funcsave, поэтому вы можете удалить сразу несколько функций:

function funcdel --description 'Deletes a fish function both permanently and from memory'
    set cf (status function)
    set -l options 'h/help'
    argparse -n funcdel $options -- $argv
    or return

    # should create a manpage
    if set -q _flag_help
        __fish_print_help cf
        return 0
    end

    if not set -q argv[1]
        printf (_ "%ls: Expected at least %d args, got only %d\n") $cf 1 0
        return 1
    end

    set -l retval 0
    for funcname in $argv
        set -l funcfile $__fish_config_dir/functions/$funcname.fish

        # Delete the in-memory function, if it exists
        functions --query -- $funcname
        if test $status -eq 0
            functions --erase -- $funcname
            printf (_ "%s: function %s removed from session\n") $cf $funcname
        else
            printf (_ "%s: Unknown function '%s'\n") $cf $funcname
        end

        # Delete the function permanently,
        # if it exists as a file in the regular location
        if test -e $funcfile
            rm $funcfile
            printf (_ "%s: %s deleted\n") $cf $funcfile
        else
            printf (_ "%s: %s not found\n") $cf $funcfile
        end
    end

    return $retval
end
person Alexander Bösecke    schedule 28.01.2020