我问的问题有点具体,可能与 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
尝试做 没有什么意义vim doc.pdf
,并且在通常情况下,我不会做vim doc.log
或vim doc.aux
。相反,我经常这样做
vim doc.tex
不幸的是,tab-autocomplete 会向我建议所有 4 个文件,而不是仅建议doc.tex
.
有没有一种方法可以让我输入vim \t
,并且这会忽略目录中的某些某些文件?
更一般地说,我可以输入 command X \t
,并编写一些设置,在其中输入 commandX
将忽略目录中的文件吗?
仅供参考:我使用 zsh。不确定 bash 和 zsh 是否会有类似的解决方案。
答案1
在 zsh 中,使用“新”补全系统(即,如果您compinit
的 中有.zshrc
),请使用file-patterns
风格。
zstyle ':completion:*:*:vim:*' file-patterns '^*.(aux|log|pdf):source-files' '*:all-files'
如果没有完成,则*.(aux|log|pdf)
仅在命令行上完成与模式匹配的文件。vim
您可以使用命令名称的模式,特别*
是匹配除显式匹配的命令之外的所有命令。
答案2
添加到此是因为我不使用 zsh,并且还有更多通用选项。
.bashrc
只需使用 bash 内置命令放入一行即可complete
。例如:
complete -f -X '*.@(aux|log|pdf)' -o plusdirs vim
where-f
将完成文件名,-X
使用 glob 字符串从可能的选择中过滤掉匹配模式,-o plusdirs
并将之后将子目录添加到列表中。