Что такое шаблоны пользовательского интерфейса командной строки fish shell?

Я хочу создать пользовательский интерфейс, похожий на то, что у git есть git <command> [<param1> ...]. Что я придумал до сих пор:

function git -d "Description"
    switch $argv[1]
        case branch
            git_branch $argv[2]
        case reset
            git_reset
    end
end

function git_branch -d "Description for branch"
    do_something $argv[1]
end

function git_reset -d "Description for reset"
    do_something_else
end

Это работает, но есть пара проблем:
1. Fish не выбирает доступные команды для автодополнения;
2. Если я запускаю git без аргументов, он не выводит ни список команд, ни он подберет для них описания.

Мне кажется, что то, что я делаю, не является «правильным» способом создания утилит командной строки с помощью fish. Итак, каков правильный путь?


person Andrew    schedule 29.03.2014    source источник
comment
Вы пытаетесь заново реализовать Git?!   -  person Biffen    schedule 29.03.2014
comment
@Biffen, конечно, нет, у меня есть набор сценариев для автоматизации моего рабочего процесса, и я хочу, чтобы все они были доступны через одно и то же пространство имен, поэтому у меня могут быть разные сценарии для разных проектов с одинаковыми простыми именами, такими как project_1 sync и так далее. на.   -  person Andrew    schedule 29.03.2014
comment
Хм, у меня также есть функция git, и git <tab> выполняет автодополнение подкоманд git. У меня нет специальных дополнений git.   -  person glenn jackman    schedule 29.03.2014
comment
@glennjackman fish имеет встроенное автозаполнение git (см. github.com/fish-shell/fish-shell/blob/master/share/completions/ ), но мой вопрос не связан с самим git.   -  person Andrew    schedule 30.03.2014
comment
Я это понимаю. Я просто говорил, что мы с вами делаем одно и то же с разными результатами. Подожди, я вижу разницу...   -  person glenn jackman    schedule 02.04.2014


Ответы (1)


Возможно, ваши проблемы возникают из-за того, что у вас нет ветки по умолчанию, если ваш оператор switch, поэтому вы никогда не вызываете реальную команду git. Пытаться:

function git -d "Description"
    switch $argv[1]
        case branch
            git_branch $argv[2]
        case reset
            git_reset
        case '*'
            command git $argv
    end
end

Чтобы защититься от случая, когда предоставляются нулевые аргументы, я делаю это:

function git -d "Description"
    set -q argv[1]
    and switch $argv[1]
        case branch
            git_branch $argv[2]
            return
        case reset
            git_reset
            return
    end
    command git $argv
end
person glenn jackman    schedule 02.04.2014