假设我有一个简单的 makefile,例如:
hello:
echo "hello world"
bye:
echo "bye bye"
然后在 bash 我想要类似的东西:
制作 h <标签>
所以它可以完成
打个招呼
我找到了一种简单的方法,比如创建空文件hello
,bye
但我正在寻找更复杂的.
假设我有一个简单的 makefile,例如:
hello:
echo "hello world"
bye:
echo "bye bye"
然后在 bash 我想要类似的东西:
制作 h <标签>
所以它可以完成
打个招呼
我找到了一种简单的方法,比如创建空文件hello
,bye
但我正在寻找更复杂的.
将此添加到您的~/.bash_profile文件或~/.bashrc文件中
complete -W "\`grep -oE '^[a-zA-Z0-9_.-]+:([^=]|$)' ?akefile | sed 's/[^a-zA-Z0-9_.-]*$//'\`" make
这会使用 grep 在 Makefile 中搜索标题为“Makefile”或“makefile”(注意 中的大写?
通配符?akefile
)的目标,并将其通过管道传递给complete
bash 中的命令,该命令用于指定如何自动完成参数。该-W
标志表示complete
命令的输入将是一个词表,它是通过传递 grep 的结果来完成的,grepsed
将其排列成所需的词表格式。
警告和陷阱:
您的 make 文件名为“GNUMakefile”或“Makefile”或“makefile”以外的任何其他名称。如果您经常遇到此类标题,请考虑相应地更改正则表达式?akefile
。
进行更改后忘记获取您的 ~/.bash_profile 或 ~/.bashrc 文件。我添加了这个看似微不足道的细节,因为对于外行来说这是不熟悉的。要使对 bash 文件的任何更改生效,请使用命令获取它们
source ~/.bashrc
或者
source ~/.bash_profile
PS。您现在还可以通过按两次 [Tab] 来显示可能的make 目标,就像在 bash 完成中一样。只需确保在命令 make 之后添加一个空格,然后再键入 [Tab] 两次。
这可能是你要找的吗?
http://freshmeat.net/projects/bashcompletion/
make [Tab] 将在 Makefile 中的所有目标上完成。该项目旨在为最常见的 Linux/UNIX 命令生成可编程完成例程,从而减少系统管理员和程序员每天需要做的打字量。
几乎每个操作系统都有一个有用的名为bash-completion的包。它包括 Makefile 完成。
(如果你使用的是 macOS 和Homebrew,你可以通过brew install bash-completion
.)
这似乎至少在 Debian Lenny 中是默认的:
$ grep Makefile /etc/bash_completion
# make reads `GNUmakefile', then `makefile', then `Makefile'
elif [ -f ${makef_dir}/Makefile ]; then
makef=${makef_dir}/Makefile
# before we scan for targets, see if a Makefile name was
# deal with included Makefiles
该文件的标题指出:
# The latest version of this software can be obtained here:
#
# http://bash-completion.alioth.debian.org/
#
# RELEASE: 20080617.5
这是一个查看 .PHONY: 声明的完成脚本。
_make_phony_words() {
local opt_revert
if [ -n "${BASH_VERSION:-}" ]; then
shopt -q nullglob || {
opt_revert=1 ; shopt -s nullglob ;
}
elif [ -n "${ZSH_VERSION:-}" ]; then
[[ -o nullglob ]] || {
opt_revert=1 ; setopt nullglob
}
fi
for f in ./?akefile ./*.make ; do
sed -nEe '/^.PHONY/ { s/^.PHONY:[ ]?// ; p ; } ' "$f" | tr ' ' $'\n' | sort -u
done
if [ -n "$opt_revert" ]; then
[ -n "${ZSH_VERSION:-}" ] && unsetopt nullglob
[ -n "${BASH_VERSION:-}" ] && shopt -u nullglob
fi
unset opt_revert
}
_make_phony_complete() {
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY+=( $(compgen -W "$( _make_phony_words )" -- ${cur}) )
}
complete -F _make_phony_complete make
在 Ubuntu 10.04 中,获取以下文件:
. /etc/bash_completion
或取消注释
/etc/bash.bashrc