Makefile的目标在Linux上完成,但是AFAICS,不在Mac OS(10.8.5)上。
是否可以使用此操作系统完成工作?
答案 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 :(得分:2)
这对我在标准zsh终端中的Catalina上起作用
在主目录中编辑名为.zshrc
的文件,可以在终端nano ~/.zshrc
上使用此命令完成
添加以下行
zstyle ':completion:*:*:make:*' tag-order 'targets'
autoload -U compinit && compinit
ctrl + x
退出并保存,然后保存Y