Mac上的Makefile自动完成功能

时间:2015-11-17 15:24:56

标签: macos autocomplete makefile

Makefile的目标在Linux上完成,但是AFAICS,不在Mac OS(10.8.5)上。

是否可以使用此操作系统完成工作?

2 个答案:

答案 0 :(得分:19)

这似乎为我在El Capitan上实现了简单的bash完成:

# .bashrc
function _makefile_targets {
    local curr_arg;
    local targets;

    # Find makefile targets available in the current directory
    targets=''
    if [[ -e "$(pwd)/Makefile" ]]; then
        targets=$( \
            grep -oE '^[a-zA-Z0-9_-]+:' Makefile \
            | sed 's/://' \
            | tr '\n' ' ' \
        )
    fi

    # Filter targets based on user input to the bash completion
    curr_arg=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "${targets[@]}" -- $curr_arg ) );
}
complete -F _makefile_targets make

以下是其工作原理:

  • 完成-F [功能名称] [命令名称] - 此bash内置寄存器[命令名]的新完成,由bash函数[函数名]生成。因此,在上面的代码中,如果您在shell中输入make [TAB][TAB],则会触发_makefile_targets()函数。

  • if [[-e“$(pwd)/ Makefile”]];那么 - 确保当前目录中有一个Makefile,否则不要尝试bash完成。

  • grep -oE'^ [a-zA-Z0-9 _-] +:'Makefile - 使用正则表达式过滤Makefile的每一行,例如“test: ”。 -o表示仅返回匹配行的部分。例如,给定Makefile目标,如“test:build package”,只返回“test:”

  • <强> | sed's /://' - 获取grep结果,从行尾删除冒号

  • <强> | tr'\ n''' - 将所有目标放到一行上,用一个空格分隔

在bash完成函数中,complete为您设置了几个环境变量。 COMP_WORDS是基于用户输入内容的可用bash完成选择列表的数组。 COMP_CWORD是当前所选单词的索引。

另一个非常神奇的内置compgen将单独列出空格列表并使用当前选定的单词对其进行过滤。我一点都不清楚这是如何运作的。

所以,底线是函数中的最后两行过滤我们的makefile目标列表(存储在$targets中)并将它们推送到数组COMPREPLY中。 bash完成读取并显示COMPREPLY作为shell中的选项。

灵感来自:

  1. https://gist.github.com/tlrobinson/1073865
  2. http://www.thegeekstuff.com/2013/12/bash-completion-complete/(Esp 9。)

答案 1 :(得分:2)

这对我在标准zsh终端中的Catalina上起作用

  1. 在主目录中编辑名为.zshrc的文件,可以在终端nano ~/.zshrc上使用此命令完成

  2. 添加以下行

zstyle ':completion:*:*:make:*' tag-order 'targets'

autoload -U compinit && compinit
  1. 通过按ctrl + x退出并保存,然后保存Y