2014-09-10 55 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