我在macOS HighSierraVersion10.13.6上的macOS版本如下所示:
$ make --version
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 i386-apple-darwin11.3.0我的Bash版本看起来如下:
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.我的当前目录如下:
$ ls -1
Makefile
a.txt
b.txt
c.txt我的Makefile看起来是这样的:
hello:
echo hello
%.txt: FORCE
cat "$@"
FORCE:案例1:没有bash-completion
当我没有安装bash-completion时,可以方便地自动完成当前目录中的文件名,作为make的目标参数。我是说,如果我打字:
make a<TAB>它将自动完成以下工作:
make a.txt案例2:使用bash-completion
当我有bash-completion (比如brew install bash-completion)时,我就不能再使用这种行为了。
如果我输入:
make a<TAB>它根本不自动完成。它现在可以自动完成其他目标,如make he<TAB>和make FO<TAB>,这在以前是不可能的,但是我失去了自动完成任何任意文件名。
问题
bash-completion会禁用自动完成当前文件名的默认行为?我认为这是一种非常方便的行为。bash-completion的情况下,我如何才能找回这种行为。如果我能做到这一点,我就能拥有两个世界中最好的。使用bash-completion提供的自动完成以及当前目录中的自动完成文件名.发布于 2019-02-06 07:40:02
为了回答您问题的第一部分,我认为大多数人都不希望Bash提供工作目录中的文件作为make的建议目标。
但你可以在没有太多麻烦的情况下定制这种行为。
有关Bash完成的一些有用的文档可以找到这里。
看起来,Mac上使用的Bash完成程序的源代码是这里。你关心的是这一条:
COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
{split($1,A,/ /);for(i in A)print A[i]}' )" \
-- "$cur" ) )您可以看到,那里的compgen内置器根据make -qp Makefile .的输出生成可能完成的列表。
你可以用你想要的方式来破解它。首先,将特定于make的自动完成文件复制到用户bash完成文件:
cp /usr/local/Cellar/bash-completion/1.3_3/etc/bash_completion.d/make ~/.bash_completion然后编辑该文件以指定稍微不同的行为。在这里,我会展示给大家看:
--- /usr/local/Cellar/bash-completion/1.3_3/etc/bash_completion.d/make 2019-02-06 18:35:00.000000000 +1100
+++ /Users/alexharvey/.bash_completion 2019-02-06 18:34:36.000000000 +1100
@@ -62,7 +62,7 @@
COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
- {split($1,A,/ /);for(i in A)print A[i]}' )" \
+ {split($1,A,/ /);for(i in A)print A[i]}' ; ls * )" \
-- "$cur" ) )
fi注意,我所做的就是将ls *的输出附加到返回给compgen的响应中,这样它就可以将工作目录中的文件看作是可能的选项卡完成。
就是这样。开始一个新的外壳。
https://stackoverflow.com/questions/54545753
复制相似问题