2014-09-10 79 views
5

比方说,我Makefile是一样的东西:的Makefile变量自动完成

DIR :=# 

foobar: 

    ls ${DIR} 

当我输入

mak[tab] f[tab] 

它给正确

make foobar 

make foobar D[tab] 

没有做魔术

make foobar DIR= 

所以我的问题是:有没有办法来自动完成Makefile中的变量太多(除了目标)在bash?

+0

为此,您需要修改make bash completion函数,该函数提取目标名称以提取变量名称。应该可以做到这一点,但我不能说这将是多少工作。 – 2014-09-10 13:58:10

+0

我几乎可以肯定,bash完成“foobar”不是因为“foobar”是makefile中的目标,而是因为你有一个名为'foobar'的文件。 – Beta 2014-09-11 00:43:24

+0

@贝塔感谢您的反馈!不,为了测试目的,我在Makefile目录中创建了2个子目录(名为“asd”和“qwe”)。顺便说一句,我使用Debian测试,使4.0和bash 4.3.24 – 2014-09-11 08:00:47

回答

2

这个答案还不完整。与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的希望/错误报告来添加此功能。

+0

谢谢,+1。在bash完成项目中填入愿望清单项目。 – 2014-10-17 22:12:23