我有一个包含目标的 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 实现一起使用。)