假设我有一个文件名和不同的扩展名:
test.tex
test.pdf
Run Code Online (Sandbox Code Playgroud)
只输入不带扩展名的文件名,然后输入整个文件名更容易。这是可能的,因为相应的程序知道他们需要的扩展名并自动附加它。以下示例完美运行:
tex test
pdf-viewer test
Run Code Online (Sandbox Code Playgroud)
但是在这里使用 bash 补全总是让我厌烦添加尾随点。例如:
tex te<TAB>
Run Code Online (Sandbox Code Playgroud)
变成了
tex test.
Run Code Online (Sandbox Code Playgroud)
但是应用程序会失败并报错;每次点击后我都必须按退格键<TAB>
:-(
如何告诉 bash 在进行自动完成时不要添加尾随点?
可能有一种更简单的方法,但这似乎有效:
texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }
complete -F texfiles tex
Run Code Online (Sandbox Code Playgroud)
首先设置一个名为 的 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
Run Code Online (Sandbox Code Playgroud)
(ile
infile
是由shell插入的)
阅读手册的“可编程完成”部分bash
了解详细信息。