Как стать автором
Обновить

Bash completion для Composer

Symfony
Tutorial
Всем доброго времени суток.

Посвящается тем, кто использует Composer, но столкнулся с тем, что при выборе пакета для установки (require) нужно вписать версию этого пакета. Не очень удобно постоянно ее где-то искать, даже используя * не всегда удается все правильно установить.

Таким образом, я решил опубликовать скрипт автоподстановки.
На данный момент о него требуется подстановка имен пакетов, а в случае если пакет уже подставлен, то версию этого пакета, лишь для команды require.

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

Сам скрипт лежит обычно по пути (можно туда сделать симлинк, ну или кому как)
/usr/share/bash-completion/completions
Содержимое скрипта
# Composer completion

_composer()
{
    local cur prev words cword
    _init_completion || return

    local special i
    for (( i=0; i < ${#words[@]}-1; i++ )); do
        if [[ ${words[i]} == @(require) ]]; then
            special=${words[i]}
        fi
    done

    if [[ -n $special ]]; then
        if [[ $prev != $special ]]; then
            # полагаем, что предыдущее это пакет и он существует,
            # тогда посмотрим его версии
            COMPREPLY=( $( composer show $prev 2>/dev/null | \
                sed -r -e 's/\x1b\[[0-9]+m//g' | grep ^versions | \
                sed -r -e 's/^versions : //' -e 's/, /\n/g' | grep "^$cur" | sort -u ) )
        fi
        if [[ -z $COMPREPLY ]]; then
            # если то был не пакет, то подставляем пакет на основе текущего слова
            COMPREPLY=( $( composer show -a 2>/dev/null | \
                grep -v '^No composer' | grep "^$cur" | sort -u ) )
        fi
        return 0
    fi

    # дополняемся ключами и командами
    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-h -q -v -V -n -d \
            --help --quiet --verbose --version --ansi --no-ansi \
            --no-interaction --profile --working-dir' -- "$cur" ) )
    else
        COMPREPLY=( $( compgen -W 'about archive config create-project \
            depends diagnose dump-autoload dumpautoload \
            help init install list require search \
            self-update selfupdate show status update validate' -- "$cur" ) )
    fi

    return 0
} &&
complete -F _composer composer # регистрируем обработчик для команды composer


Из минусов хочу отметить долгий отклик из-за того, что сам composer медленно читает свое хранилище.
Последнее частично исправлено за счет кеширования списка пакетов и их версий, но до следующего обновления самого композера.
Получается, что есть вероятность не автодополнить в строку пакет который уже есть в списке, но не было во время кеширования. В этом случае надо либо удалить кеш, либо обновить сам композер. Вот как то так… ну я считаю это компромиссом.

Конечно, же необходимо чтобы Composer был установлен в системе как composer.
Лично, я сунул его в /usr/local/bin и периодически обновляю через sudo composer self-update.

Если у кого есть желание что-то добавить улучшить, то прошу на Github

На этом все.
Всем спасибо!
Теги:bashbash_completioncomposer
Хабы: Symfony
Всего голосов 10: ↑8 и ↓2+6
Просмотры4K
Комментарии Комментарии 3

Похожие публикации

Лучшие публикации за сутки