完成工具

使用控制台为开发人员提供了许多可能性,但必须完全了解并编写这些命令可能很繁琐。 特别是在开发新 shell 时,命令会因分钟迭代而异。 完成 Shell 通过提供 API 来编写 bash、zsh、fish 等 shell 的完成脚本,从而帮助解决这个问题。

子命令

完成 Shell 包含许多子命令,以帮助开发人员创建其完成脚本。 每个命令对应于自动完成过程中的不同步骤。

命令

对于第一步,commands 输出可用的 Shell 命令,包括适用的插件名称。(此命令和其他子命令返回的所有可能性都用空格隔开。)例如

bin/cake Completion commands

返回值

acl api bake command_list completion console i18n schema server test testsuite upgrade

您的完成脚本可以从该列表中选择相关的命令以继续执行。(对于此命令和以下子命令。)

子命令

一旦选择了首选命令,subCommands 就会作为第二步出现,并输出给定 shell 命令的可能子命令。 例如

bin/cake Completion subcommands bake

返回值

controller db_config fixture model plugin project test view

选项

作为第三步也是最后一步,options 输出在 getOptionParser 中设置的给定(子)命令的选项。(包括从 Shell 继承的默认选项。)例如

bin/cake Completion options bake

返回值

--help -h --verbose -v --quiet -q --everything --connection -c --force -f --plugin -p --prefix --theme -t

您还可以传递额外的参数作为 shell 子命令:它将输出此子命令的特定选项。

如何为 CakePHP 控制台启用 Bash 自动完成

首先,确保已安装 bash-completion 库。 如果没有,您可以使用以下命令进行安装

apt-get install bash-completion

/etc/bash_completion.d/ 中创建一个名为 cake 的文件,并将 Bash 完成文件内容 放入其中。

保存文件,然后重新启动您的控制台。

注意

如果您使用的是 MacOS X,可以使用 homebrew 通过命令 brew install bash-completion 安装 bash-completion 库。 cake 文件的目标目录将是 /usr/local/etc/bash_completion.d/

Bash 完成文件内容

这是您需要放在正确位置的 cake 文件中的代码,以便在使用 CakePHP 控制台时获得自动完成

#
# Bash completion file for CakePHP console
#

_cake()
{
    local cur prev opts cake
    COMPREPLY=()
    cake="${COMP_WORDS[0]}"
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    if [[ "$cur" == -* ]] ; then
        if [[ ${COMP_CWORD} = 1 ]] ; then
            opts=$(${cake} Completion options)
        elif [[ ${COMP_CWORD} = 2 ]] ; then
            opts=$(${cake} Completion options "${COMP_WORDS[1]}")
        else
            opts=$(${cake} Completion options "${COMP_WORDS[1]}" "${COMP_WORDS[2]}")
        fi

        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi

    if [[ ${COMP_CWORD} = 1 ]] ; then
        opts=$(${cake} Completion commands)
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi

    if [[ ${COMP_CWORD} = 2 ]] ; then
        opts=$(${cake} Completion subcommands $prev)
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        if [[ $COMPREPLY = "" ]] ; then
            _filedir
            return 0
        fi
        return 0
    fi

    opts=$(${cake} Completion fuzzy "${COMP_WORDS[@]:1}")
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    if [[ $COMPREPLY = "" ]] ; then
        _filedir
        return 0
    fi
    return 0;
}

complete -F _cake cake bin/cake

使用自动完成

启用后,自动完成可以使用与其他内置命令相同的方式,使用 TAB 键。 提供了三种类型的自动完成。 以下输出来自一个新的 CakePHP 安装。

命令

命令自动完成的示例输出

$ bin/cake <tab>
bake        i18n        schema_cache   routes
console     migrations  plugin         server

子命令

子命令自动完成的示例输出

$ bin/cake bake <tab>
behavior            helper              command
cell                mailer              command_helper
component           migration           template
controller          migration_snapshot  test
fixture             model
form                plugin

选项

子命令选项自动完成的示例输出

$ bin/cake bake -<tab>
-c            --everything  --force       --help        --plugin      -q            -t            -v
--connection  -f            -h            -p            --prefix      --quiet       --theme       --verbose