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 구현에서는 작동하지 않습니다.)

관련 정보