使用包含 make 文件的 Zsh 完成 GNU Make 目标

使用包含 make 文件的 Zsh 完成 GNU Make 目标

GNU 制作 4.3+

操作系统:Mac

将以下内容添加到.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 正在工作)


zsh即使 make 文件包含支持 make 文件,如何配置以从 makefile 生成完整的用户定义目标列表?

答案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”。

相关内容