Zsh

在 zsh 中使用 makro 自動完成生成文件不正確(在 bash 中有效)

  • July 6, 2021

我有一個具有目標的生成文件

  • 啟動產品
  • 開始測試
  • 停止產品
  • 停止測試
  • 重啟產品
  • 重啟測試

自動完成在 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

帶有選項的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 實現。)

引用自:https://unix.stackexchange.com/questions/657256