zsh 中使用 makro 自动完成 makefile 不正确(在 bash 中工作)

zsh 中使用 makro 自动完成 makefile 不正确(在 bash 中工作)

我有一个包含目标的 makefile

  • 启动产品
  • 开始测试
  • 停止生产
  • 停止测试
  • 重新启动产品
  • 重新启动测试

自动补全在 bash 中工作没有问题,但在 zsh 中它只会完成start-等,而不是start-prod

目标是用 makros 定义的。

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

Bash 调用make的选项使其以标准化形式打印出评估后的 makefile。 Zsh 也可以做到这一点,但默认情况下它使用自己的解析器。调用make提供了更精确的信息,但由于它评估诸如$(shell)makefile 内的命令之类的内容,因此在您不信任 makefile 的内容的极少数情况下,它可能会更慢并且很危险(尽管这种情况非常罕见,因为原因您使用完成是因为您make无论如何都计划运行)。

要使 zsh 调用该make命令,请启用call-command 完成 风格。 (要找出要设置的确切样式模式,查看set -x活动时生成的跟踪比找出文档更容易。)

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

替换make*for 可应用于其他完成,例如 for ant

make即使启用了此功能,如果不是 GNU make,zsh 也不会调用,因此您可以在任何地方启用它,而不会丢失功能。 (Bash 可以,因此 bash 的完成功能不能与其他 make 实现一起使用。)

相关内容