make 파일이 포함된 Zsh를 사용하여 GNU Make 대상을 완성합니다.

make 파일이 포함된 Zsh를 사용하여 GNU Make 대상을 완성합니다.

GNU 메이크 4.3+

운영 체제: 맥

.zshrc파일 에 다음을 추가한 후 이 텍스트 파일의 포함 규칙 make에 대해 대상 수준에서 Makefile (or 'makefile')자동 완성을 생성 할 수 있었습니다.

zstyle ':completion:*:*:make:*' tag-order 'targets'
autoload -U compinit && compinit

그러나 명령을 하위 파일로 그룹화하고 include *.mk메커니즘을 통해 포함 하면 zsh올바른 자동 완성 문이 더 이상 생성되지 않습니다.오직최상위 makefile에 정의된 대상을 출력합니다.


정확한 파일 구조:

├── install-brew
├── install-oh-my-zsh
├── install-pathogen
├── makefile
├── mk
│   ├── get.mk
│   ├── notes.mk
│   ├── setup.mk
    ...

그리고 makefile:

include mk/*.mk

foo:
  echo foo

bar:
  echo bar

> make [tab]생산하다:

> make foo
foo bar

그리고 make get-brew:

if [ -z `command -v brew` ]; then ./install-brew; else echo "brew detected: `command -v brew`" >&2; fi

(그래서 makefile이 작동 중입니다)


zshmake 파일에 지원 make 파일이 포함되어 있더라도 make 파일에서 사용자 정의 대상의 전체 목록을 생성하도록 구성하려면 어떻게 해야 합니까?

답변1

zstyle ':completion:*:make:*:targets' call-command true
zstyle ':completion:*:*:make:*' tag-order 'targets'

레벨 2 makefile "include"의 경우 이것은 저에게 효과적이었습니다. .zshrc 파일에 추가하기만 하면 됩니다. 원천:https://github.com/zsh-users/zsh-completions/issues/813#issuecomment-902592371

GNU가 감지되면 make완료 호출이 발생하여 가능한 대상 목록을 결정하는 데 도움이 됩니다.make -nsp --no-print-directory --always-makemakemake

예전에는 무조건 그랬지만zstyle2001년 조건부 설정으로 변경make이를 호출하는 것은 결국 비용이 많이 들고 잠재적으로 위험한 작업이 될 수 있기 때문 입니다.

스타일에 대한 설명을 call-command찾을 수 있습니다.info zsh call-command:

call-command

make이 스타일은 일치 항목을 생성하기 위해 명령을 직접 호출 하면 ant속도가 느려지는 등의 문제가 발생하거나 make의 경우 makefile의 작업이 실행될 수 있는 등의 명령 기능에 사용됩니다 . "true"로 설정되면 일치 항목을 생성하기 위해 이 명령이 호출됩니다. 이 스타일의 기본값은 "false"입니다.

관련 정보