Bash/zsh 选项卡自动完成:给定初始命令,使用自动完成忽略目录中的某些文件

hli*_*117 10 bash zsh autocomplete

我要问的有点具体,可能与 Unix Stackexchange 上的其他自动完成问题不同。

假设我有一个看起来像这样的目录

-rw-r--r-- 1 hlin117 staff 1.1K Sep 19 13:05 doc.aux
-rw-r--r-- 1 hlin117 staff  26K Sep 19 13:05 doc.log
-rw-r--r-- 1 hlin117 staff 177K Sep 19 13:05 doc.pdf
-rw-r--r-- 1 hlin117 staff  13K Sep 19 13:01 doc.tex
Run Code Online (Sandbox Code Playgroud)

尝试做没有什么意义vim doc.pdf,在常见情况下,我不会做vim doc.logvim doc.aux。相反,我经常这样做

vim doc.tex
Run Code Online (Sandbox Code Playgroud)

不幸的是,tab-autocomplete 会向我建议所有 4 个文件,而不仅仅是doc.tex.

有没有办法可以输入vim \t,而这会忽略我目录中的某些文件?

更一般地说,我可以输入 command X \t,并写一些设置,其中输入 commandX将忽略我目录中的文件吗?

仅供参考:我使用 zsh。不确定 bash 和 zsh 是否会有类似的解决方案。

Gil*_*il' 10

在zsh中,用“新”完成系统(即,如果你有compinit你的.zshrc),使用file-patterns风格

zstyle ':completion:*:*:vim:*' file-patterns '^*.(aux|log|pdf):source-files' '*:all-files'
Run Code Online (Sandbox Code Playgroud)

如果没有完成,则匹配模式的文件*.(aux|log|pdf)将仅在vim命令行上完成。

您可以为命令名称使用模式,特别*是匹配除明确匹配的命令之外的所有命令。


Luk*_*vis 7

添加到这一点是因为我不使用 zsh,并且有更多的通用选项。

只需.bashrc使用 bash 内置命令将其放入一行即可complete。例如:

complete -f -X '*.@(aux|log|pdf)' -o plusdirs vim
Run Code Online (Sandbox Code Playgroud)

其中,-f将完成的文件名,-X筛选出有水珠字符串匹配从可能的选择模式,-o plusdirs后来添加子目录到列表中。