比方说,我Makefile
是一样的东西:的Makefile变量自动完成
DIR :=#
foobar:
ls ${DIR}
当我输入
mak[tab] f[tab]
它给正确
make foobar
但
make foobar D[tab]
没有做魔术
make foobar DIR=
所以我的问题是:有没有办法来自动完成Makefile中的变量太多(除了目标)在bash?
比方说,我Makefile
是一样的东西:的Makefile变量自动完成
DIR :=#
foobar:
ls ${DIR}
当我输入
mak[tab] f[tab]
它给正确
make foobar
但
make foobar D[tab]
没有做魔术
make foobar DIR=
所以我的问题是:有没有办法来自动完成Makefile中的变量太多(除了目标)在bash?
这个答案还不完整。与grep的所有变量中,我们使用make -p
打印Makefile文件数据库一个Makefile:
# GNU Make 3.81
# Copyright (C) 2006 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.
# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
# This program built for x86_64-pc-linux-gnu
# Make data base, printed on Mon Oct 13 13:36:12 2014
# Variables
# automatic
<D = $(patsubst %/,%,$(dir $<))
# automatic
?F = $(notdir $?)
# environment
DESKTOP_SESSION = kde-plasma
# ...
# makefile (from `Makefile', line 1)
DIR :=
我们正在寻找开始# makefile (from 'Makefile', line xy)
线和提取以下变量的名称:
$ make -p | sed -n '/# makefile (from/ {n; p;}'
MAKEFILE_LIST := Makefile
DIR :=
在下一步我们删除的一切,但变量名(:=
后一切):
$ make -p Makefile | sed -n '/# makefile (from/ {n; s/^\([^.#:= ]\+\) *:\?=.*$/\1/p;}'
MAKEFILE_LIST
DIR
个
以下行示范如何可以做到:
_make_variables()
{
# get current completion
local cur=${COMP_WORDS[COMP_CWORD]}
# get list of possible makefile variables
local var=$(make -p Makefile | sed -n '/# makefile (from/ {n; s/^\([^.#:= ]\+\) *:\?=.*$/\1=/p;}')
# don't add a space after completion
compopt -o nospace
# find possible matches
COMPREPLY=($(compgen -W "${var}" -- ${cur}))
}
# use _make_variables to complete make arguments
complete -F _make_variables make
现在make D[tab]
结果make DIR=
。
不幸的是你会失去所有的文件和目标完成这种方法。从完成输出中删除一些更多的变量(例如MAKEFILE_LIST
)也是有用的。
也许值得填写一个针对bash-completion project的希望/错误报告来添加此功能。
谢谢,+1。在bash完成项目中填入愿望清单项目。 – 2014-10-17 22:12:23
为此,您需要修改make bash completion函数,该函数提取目标名称以提取变量名称。应该可以做到这一点,但我不能说这将是多少工作。 – 2014-09-10 13:58:10
我几乎可以肯定,bash完成“foobar”不是因为“foobar”是makefile中的目标,而是因为你有一个名为'foobar'的文件。 – Beta 2014-09-11 00:43:24
@贝塔感谢您的反馈!不,为了测试目的,我在Makefile目录中创建了2个子目录(名为“asd”和“qwe”)。顺便说一句,我使用Debian测试,使4.0和bash 4.3.24 – 2014-09-11 08:00:47