如何在 bash 中获得相当于 tcsh 增强补全的功能?

如何在 bash 中获得相当于 tcsh 增强补全的功能?

在里面tcsh 联机帮助页, 的影响set complete = enhance定义如下:

[...] 完成 1) 忽略大小写,2) 将句点、连字符和下划线(“.”、“-”和“_”)视为单词分隔符,并且连字符和下划线是等效的。

关于1),我知道readline可以通过配置忽略大小写set completion-ignore-case on。所以我的问题只涉及2)。

例如,如果我有一个目录,其中包含多个基本名称相似但扩展名不同的文件,如下所示:

$ ls
file0.dat file1.dat file2.dat files.sh

然后我希望 shell 能够完成文件扩展名:

$ cat .sh<TAB>
$ cat files.sh

有没有办法实现或至少模仿这种行为bash

编辑

在第一个答案之后,以下是更准确地显示该tcsh功能如何工作的其他示例:

$ ls
abc.foo abc.bar cab.foo cab.bar
$ cat a.f<TAB>
$ cat abc.foo

或者:

$ cat .b<TAB>
abc.bar cab.bar
$ cat .bar

实际上,tcsh完成了基本名称和扩展名。这里的行为是列出多个可能性,就像通常使用 TAB 补全一样,而不是全部插入。

答案1

这不完全是您所需要的,但也很接近。Ctrl+ x,快捷方式gC-x g在 emacsspeak 中)快捷方式将列出 glob 的扩展。所以,在你的例子中:

$ cat *.b*<Ctrl><x><g>
abc.bar  cab.bar  

因此,与您所描述的不同tcsh,这需要一个有效的 glob。换句话说,它相当于

$ echo *.b*

请注意,快捷键是同时按下Ctrlx,然后松开并按下g

这记录在man bash

   glob-list-expansions (C-x g)
          The list  of  expansions  that  would  have  been  generated  by
          glob-expand-word  is  displayed,  and the line is redrawn.  If a
          numeric argument is supplied, an  asterisk  is  appended  before
          pathname expansion.

相关内容