
ターゲットを含むメイクファイルがあります。
- 製品リリース
- テスト開始
- 生産を中止する
- テスト停止
- 製品の再起動
- テストの再開
オートコンプリートはbashでは問題なく機能しますが、zshでは代わりに完了start-
などを行いますstart-prod
。
目標はマクロスを使用して定義されます。
define commands =
$(eval
restart-$(1): stop-$(1) start-$(1)
start-$(1): ; docker-compose up -d --remove-orphans $(1)
stop-$(1): ; docker-compose stop $(1)
)
endef
$(call commands,prod)
$(call commands,test)
私の仮定は、bashがmakefileを評価してターゲットを取得し、zshがそれを解析しようとすることです。
zshで動作させる方法はありますか?
この記事で述べたように、zshでbashコマンドを試しました。質問。しかし、これはmakefileを完了しようとしたときにのみエラーが発生します。
_init_completion: command not found zsh
答え1
make
Bashは、評価されたmakefileを正規化された形式で印刷するオプションと一緒に呼び出されます。 Zshもこれを行うことができますが、デフォルトでは独自のパーサーを使用します。呼び出しはより正確な情報を提供しますが、makefile内のコマンドなどの項目をmake
評価するため、makefileの内容を信頼しないまれなケースでは、遅くて危険になる可能性があります(この場合は非常にまれですが、$(shell)
使用完了はmake
とにかく実行する予定です) )。
make
zsh にこのコマンドを呼び出すには、以下を有効にします。call-command
終わる スタイル。 (設定する正確なスタイルモードを見つけるには、ドキュメントをset -x
見つけるよりもアクティビティによって生成されたトレースを表示する方が簡単です。)
zstyle ':completion::complete:make:*:targets' call-command true
make
forで置き換えることは、*
forなどの他の完成にも適用できますant
。
make
この機能を有効にしてもGNU makeでなければzshは呼び出されないため、機能を失うことなくどこでも有効にできます。 (Bashはそうです。したがって、bashの完成は他のmake実装では機能しません。)