Bash completion для Composer

в 9:20, , рубрики: bash, composer, symfony, метки: ,

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

Посвящается тем, кто использует 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

На этом все.
Всем спасибо!

Автор: arren

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js