在里面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,快捷方式g(C-x g
在 emacsspeak 中)快捷方式将列出 glob 的扩展。所以,在你的例子中:
$ cat *.b*<Ctrl><x><g>
abc.bar cab.bar
因此,与您所描述的不同tcsh
,这需要一个有效的 glob。换句话说,它相当于
$ echo *.b*
请注意,快捷键是同时按下Ctrl和x,然后松开并按下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.