假设我有一个文件名和不同的扩展名:
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
(ile
infile
是由shell插入的)
阅读手册的“可编程完成”部分bash
了解详细信息。
答案2
将命令的自定义完成规范添加tex
到您的.bashrc
.指定tex
应使用文件名完成后,您可以添加一个过滤器来删除任何参数不*.tex
从可能的完成情况进行匹配。
complete -f -X '!*.tex'
现在,如果您的目录中有test.tex
, test.aux
, 和test.pdf
,则前缀test
为仅有的完成到test.tex
.这样就完成了所需文件的全名,而不是跳过.
创建快捷方式。