如何防止 bash 自动完成尾随点?

如何防止 bash 自动完成尾随点?

假设我有一个文件名和不同的扩展名:

test.tex
test.pdf

仅键入不带扩展名的文件名然后键入整个文件名会更容易。这是可能的,因为相应的程序知道它们需要的扩展名并自动附加它。以下示例完美运行:

tex test
pdf-viewer test

但在这里使用 bash 补全会添加尾随点,这让我不断感到烦恼。例如:

tex te<TAB>

变成

tex test.

但应用程序会因错误而失败;每次点击后我都必须按退格键<TAB>:-(

如何告诉 bash 在自动完成时不要添加尾随点?

答案1

可能有一种更简单的方法,但这似乎有效:

texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }

complete -F texfiles tex

首先设置一个名为 的 shell 函数texfiles。它使用第二个命令行参数($2,用户在按Tab完成该单词之前在命令行中键入的单词),并COMPREPLY使用所有匹配的名称填充数组"$2"*.tex

对于每个名称,.tex在将其添加到数组之前都会删除后缀。

然后使用该complete命令告诉 shell 执行该命令texfiles的文件名补全函数tex具体来说。您可以complete对所有应.tex以相同方式完成文件的命令重复相同的命令。因为pdf-viewer您可能想创建一个相应的pdffiles函数(这些函数的名称是任意的)。

这就是它的实际效果(<tab>表示我按下了该Tab键):

bash-4.4$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Sep 28 21:43 README.txt
-rw-r--r--  1 kk  wheel  0 Sep 28 21:12 file.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:24 file2.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:25 hello.tex

bash-4.4$ tex <tab><tab>
file   file2  hello
bash-4.4$ tex

bash-4.4$ tex f<tab>ile<tab><tab>
file   file2
bash-4.4$ tex file

ileinfile是由shell插入的)

阅读手册的“可编程完成”部分bash了解详细信息。

答案2

将命令的自定义完成规范添加tex到您的.bashrc.指定tex应使用文件名完成后,您可以添加一个过滤器来删除任何参数*.tex从可能的完成情况进行匹配。

complete -f -X '!*.tex'

现在,如果您的目录中有test.tex, test.aux, 和test.pdf,则前缀test仅有的完成到test.tex.这样就完成了所需文件的全名,而不是跳过.创建快捷方式。

相关内容