比方說,我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