zshでmakroを使用して誤ったmakefileオートコンプリート(bashで動作)

zshでmakroを使用して誤ったmakefileオートコンプリート(bashで動作)

ターゲットを含むメイクファイルがあります。

  • 製品リリース
  • テスト開始
  • 生産を中止する
  • テスト停止
  • 製品の再起動
  • テストの再開

オートコンプリートは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

makeBashは、評価されたmakefileを正規化された形式で印刷するオプションと一緒に呼び出されます。 Zshもこれを行うことができますが、デフォルトでは独自のパーサーを使用します。呼び出しはより正確な情報を提供しますが、makefile内のコマンドなどの項目をmake評価するため、makefileの内容を信頼しないまれなケースでは、遅くて危険になる可能性があります(この場合は非常にまれですが、$(shell)使用完了はmakeとにかく実行する予定です) )。

makezsh にこのコマンドを呼び出すには、以下を有効にします。call-command 終わる スタイル。 (設定する正確なスタイルモードを見つけるには、ドキュメントをset -x見つけるよりもアクティビティによって生成されたトレースを表示する方が簡単です。)

zstyle ':completion::complete:make:*:targets' call-command true

makeforで置き換えることは、*forなどの他の完成にも適用できますant

makeこの機能を有効にしてもGNU makeでなければzshは呼び出されないため、機能を失うことなくどこでも有効にできます。 (Bashはそうです。したがって、bashの完成は他のmake実装では機能しません。)

おすすめ記事