作曲家和命令行完成

随着我的脚本越来越多地添加到composer.json文件中,在bashcomposer命令具有自动完成功能将很有用。 我在Twitter上的问题并没有给出立即的解决方案,并且由于我已经在为Phing做类似的事情,所以我袖手旁观并编写了解决方案。


我们首先在bash_completion.d目录中创建一个名为composer的新bash完成文件(该文件需要执行权限)。 该目录通常位于/etc/bash_completion.d/ ,但是在使用Homebrew的 OS X上,该目录位于/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 '/^ +[az]+/ { print $1 }') COMPREPLY=( $(compgen -W "${scripts}" -- ${cur}) ) fi __ltrim_colon_completions "$cur" return 0 } complete -F _composer_scripts composer 

(请注意,只有最新版本的bash-complete支持__ltrim_colon_completions ,因此您可能需要删除此行。)


要获得作曲家的命令列表,我们通过运行composer --no-ansicompgen的-W选项创建一个单词列表,然后使用AWK删除不是命令的所有内容。 当用户在输入连字符后按下Tab键时,我们还将创建一个单独的标志参数列表。


通过运行composer {cmd} -h --no-ansi ,我们自动为任何子命令填写标志,并使用trgrep将列表限制为仅以连字符开头的单词。


现在,在作曲家之后按Tab,bash将自动完成内置的作曲家命令和用户脚本!



在本示例中可以看到,除了内置命令(如dump-autoloadshow ,还显示了我自己的脚本,包括apiary-fetch和其他脚本。


当记忆使我失败时,这非常有用!

Source: https://habr.com/ru/post/zh-CN444284/


All Articles