Laravel4、BashシェルでのArtisanコマンド補完

タグ: Laravel4  

シェルにzshを使用していた場合、人気のあるoh-my-zshというプラグインとテンプレートのフレームワークにはLaravel4用のプラグインが含まれているので、簡単にコマンド名の補完ができます。

(追記:現在5.1LTSまで対応しています。)

通常、.zshrcでプラグインを有効にします。

plugins=(git laravel4)

bashにも、Artisanコマンドの補完は有志により作成されていたのですが、Laravelの方にもコードを用意しておく必要があるなど、使い勝手が良いものではありませんでした。多分、同じような仕組みのSymfony用の補完を参考にして作成されたものだと思われます。もう、作者さんが更新しないと言っていますし、Artisanのデフォルトコマンドも長いものが多いため、作成しました。

https://github.com/HiroKws/ArtisanBashCompletion

READMEに詳細を書いておいたので、お読みください。

必要なのは、bash-complitionパッケージです。通常、Linuxのディストリビューションであれば、デフォルトでもインストール済みなものが多いと思います。入っていなくても、標準的なパッケージ・リポジトリーには含まれているでしょう。

インストールすると、次のような補完ができるようになります。なお、コードはartisanでエイリアスを切ってあることを前提に動作します。

$ artisan

この状態で、タブを2回叩けば、artisan listを実行した時に表示される、Artisanコマンド名が補完されます。もちろん、Composerでインストールした、Laravelのパッケージに含まれるコマンドも、有効にしてあれば補完されます。

$ artisan queue:work

このように、有効なArtisanコマンドが指定されている状態で、タブを叩けば、そのオプションが表示されます。一回叩けば、ハイフンが一つだけ補完されます。

$ artisan queue:work -

ハイフンが一つだけ補完される理由は、オプションはハイフンで始まるからです。オプションにはハイフンが一つと英文字一つの組み合わせのショートオプションと、ハイフンが2つ続き説明的な名前が付けられているロングオプションがあります。両方の共通点は、最初のハイフンであるため、まずそれが表示されます。(一般的な補完のプロセスによります。)

更にタブを2つ叩くと、使用できるオプションの一覧が表示されます。

$ artisan queue:work -

--ansi            --memory=         --tries=          -q
--daemon          --no-ansi         --verbose         -v
--delay=          --no-interaction  --version         -vv
--env=            --queue=          -V                -vvv
--force           --quiet           -h                
--help            --sleep=          -n 

ロングオプションのコマンド名の最後に=が付いているのは、基本的にその後ろに値を指定するタイプのオプションです。それ以外のものは、スイッチタイプのオプションで、指定することで振る舞いが変更されるものです。

値を受け付けるロングタイプのオプションの一部では、その値の補完も行います。例えば"--env="では、続けて環境名が補完されます。

$ artisan queue:work --env=

この状態でタブを2つ叩くと、予めデフォルトで用意したデフォルト名が表示されます。

$ artisan queue:work --env=

local       production  testing

この環境名を変更したい場合、bashの変数として$LARAVEL_ENVIRONMENT_WORDSに定義してください。通常は.bashrcか.bash_profileの中で定義します。

export LARAVEL_ENVIRONMENT_WORDS="development staging onservice"

ロングオプション名が"path"で終わる場合は、ファイル名を補完します。

$ artisan migrate --path=

.gitattributes  artisan         composer.lock   server.php      
.gitignore      bootstrap/      phpunit.xml     vendor/         
app/            composer.json   public/

ロングオプション名が"dir"で終わる場合は、ディレクトリー名を補完対象とします。

$ artisan ide-helper:models --dir=

.git/        app/         gumby/       public/      
.sass-cache/ bootstrap/   nbproject/   vendor/

ロングオプション名の"--database="に対しては、データベース接続名を補完します。

artisan migrate --database=

mysql   pgsql   sqlite  sqlsrv

このデータベース接続名を取得するために、プロジェクトルート下の全"database.php"ファイルを読み込みます。そのため、この名前を設定ファイル以外に使用していた場合、エラーが発生する可能性があります。通常、補完は発生したエラーは表示しませんので、何も補完されないでしょう。

その他、//./../~/を指定すればいつでも対応するディレクトリーからのファイル名補完が行えます。ただし、Bashのreadlineにより、いつでもファイル補完を始めることができるキーマップが定義されているはずですので、そちらを使用するほうが便利かも知れません。お好みでどうぞ。