Pull to refresh

composer и автодополнение командной строки

Reading time2 min
Views4.3K
Original author: Rob Allen

Так как я все больше и больше добавляю свои скрипты в файлы composer.json, было бы полезно иметь автозаполнение для команды composer в bash. Мой вопрос в Твиттере не дал немедленного решения, и, поскольку я уже делал нечто подобное для Phing, я закатал рукава и написал своё решение.


Начнем с создания нового файла bash completion с именем composer в каталоге bash_completion.d (файлу необходимы права на выполнение). Этот каталог обычно находится в /etc/bash_completion.d/, но в OS X, использующей Homebrew, он находится в /usr/local/etc/bash_completion.d/ (при условии, что вы уже установили brew install bash-complete).


Вот этот файл:


# Store this file in /etc/bash_completion.d/composer

_composer_scripts() {
    local cur prev
    _get_comp_words_by_ref -n : cur

    COMPREPLY=()
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    #
    #  Complete the arguments to some of the commands.
    #
    if [ "$prev" != "composer" ] ; then
        local opts=$(composer $prev -h --no-ansi | tr -cs '[=-=][:alpha:]_' '[\n*]' | grep '^-')
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        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
        local scripts=$(composer --no-ansi 2> /dev/null |  awk '/^ +[a-z]+/ { print $1 }')
        COMPREPLY=( $(compgen -W "${scripts}" -- ${cur}) )
    fi

    __ltrim_colon_completions "$cur"
    return 0
}

complete -F _composer_scripts composer

(Обратите внимание, что __ltrim_colon_completions поддерживается только в последних версиях bash-complete, поэтому вам может потребоваться удалить эту строку.)


Чтобы получить список команд для composer, мы создаем список слов для опции -W для compgen, запустив composer --no-ansi, а затем с помощью AWK удаляем все, что не является командой. Также мы создаем отдельный список аргументов флага, когда пользователь нажимает клавишу Tab после введенного дефиса.


Запустив composer {cmd} -h --no-ansi, мы автоматически заполняем флаги для любой подкоманды и, используя tr и grep, ограничиваем список только словами, начинающимися с дефиса.


Теперь по нажатию Tab после composer, bash будет автоматически завершать как встроенные команды composer, так и пользовательские сценарии!



Как можете видеть в этом примере, помимо встроенных команд, таких как dump-autoload и show, отображаются мои собственные сценарии, включая apiary-fetch и прочие.


Это очень полезно, когда память меня подводит!

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+19
Comments2

Articles

Change theme settings