首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用bash完成将禁用自动完成文件名的默认行为。

启用bash完成将禁用自动完成文件名的默认行为。
EN

Stack Overflow用户
提问于 2019-02-06 02:16:14
回答 1查看 674关注 0票数 0

我在macOS HighSierraVersion10.13.6上的macOS版本如下所示:

代码语言:javascript
复制
$ 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版本看起来如下:

代码语言:javascript
复制
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

我的当前目录如下:

代码语言:javascript
复制
$ ls -1
Makefile
a.txt
b.txt
c.txt

我的Makefile看起来是这样的:

代码语言:javascript
复制
hello:
        echo hello

%.txt: FORCE
        cat "$@"

FORCE:

案例1:没有bash-completion

当我没有安装bash-completion时,可以方便地自动完成当前目录中的文件名,作为make的目标参数。我是说,如果我打字:

代码语言:javascript
复制
make a<TAB>

它将自动完成以下工作:

代码语言:javascript
复制
make a.txt

案例2:使用bash-completion

当我有bash-completion (比如brew install bash-completion)时,我就不能再使用这种行为了。

如果我输入:

代码语言:javascript
复制
make a<TAB>

它根本不自动完成。它现在可以自动完成其他目标,如make he<TAB>make FO<TAB>,这在以前是不可能的,但是我失去了自动完成任何任意文件名。

问题

  • 为什么安装bash-completion会禁用自动完成当前文件名的默认行为?我认为这是一种非常方便的行为。
  • 在不删除bash-completion的情况下,我如何才能找回这种行为。如果我能做到这一点,我就能拥有两个世界中最好的。使用bash-completion提供的自动完成以及当前目录中的自动完成文件名.
EN

回答 1

Stack Overflow用户

发布于 2019-02-06 07:40:02

为了回答您问题的第一部分,我认为大多数人都不希望Bash提供工作目录中的文件作为make的建议目标。

但你可以在没有太多麻烦的情况下定制这种行为。

有关Bash完成的一些有用的文档可以找到这里

看起来,Mac上使用的Bash完成程序的源代码是这里。你关心的是这一条:

代码语言:javascript
复制
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完成文件:

代码语言:javascript
复制
cp /usr/local/Cellar/bash-completion/1.3_3/etc/bash_completion.d/make ~/.bash_completion

然后编辑该文件以指定稍微不同的行为。在这里,我会展示给大家看:

代码语言:javascript
复制
--- /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的响应中,这样它就可以将工作目录中的文件看作是可能的选项卡完成。

就是这样。开始一个新的外壳。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54545753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档