我试图忽略可执行文件且其中没有点的文件,因为当我在 CI 中编码时不想用 neovim 打开二进制可执行文件。以下是我想要实现的目标:
ls -1
TODO.md
doc
jdsifqlwe.sh
own_os <-- ignore this file here, because it is an exetuable && has no dot in the name
own_os.c
我已阅读完成系统 - 标准样式部分并找到文件模式忽略模式,但我无法正确理解。我不知道为什么这不起作用:
zstyle ':completion:*:*:nvim:*' ignored-patterns '^*.*(*)'
因为这是获取正确的文件:
ls -ld ^*.*(*)
这也有效:
ls -1 *(^*) *.*(*)
但是我无法找到为文件模式执行多个 glob 模式的方法,因为当我执行以下操作时,它不起作用,因为只有当第一个参数失败时才会出现第二个参数:
zstyle ':completion:*:*:nvim:*' file-patterns '*(^*)' '*.*(*)'
重新创建目录的命令:
mkdir -p ./BogTest/doc && \
cd ./BogTest && \
touch TODO.md jqsifqlwe.sh own_os own_os.c && \
chmod +x own_os jqsifqlwe.sh
解决方案是将两个 glob 模式放入
file-patterns
同一个字符串中。从此:
对此:
感谢@ Gilles ‘SO- stop being evil’,他为我指明了正确的方向:)
正如 @Gilles 所说,
ignored-patterns
将字符串与模式进行匹配,它可用于任何补全,而不仅仅是文件补全。它不是 glob,而是扩展到文件列表的东西,因此您不能在那里使用 glob 限定符。为此,您可以使用完成实用程序函数
file-patterns
查询的样式,该样式被大多数完成文件的完成函数使用,包括/ 。_files
vim
nvim
现在,当你向 中添加某些内容时
ignored-patterns
,它不会从可能的完成中永久删除。默认completer
样式有:尽管人们通常希望添加更多内容(并且
compinstall
会帮助您添加),例如:为了完成还要做扩展,修改等。
和:
如果您输入
nvim fo
Tab,并且foo*
在中有,并且目录中ignored-patterns
有foobar
和foolish
文件但没有其他文件,则将不会产生任何结果,然后我们回到完成器,恢复被忽略的文件。foanythingelse
_complete
_ignored
如果你这样做:
那么那些没有扩展名的可执行文件将不再由 提供
_complete
,但它们也不会由 提供_ignored
,因此当您想要编辑 的那一天script-with-a-rather-long-name-and-no-dot
,您将无法完成它。你可以做的是定义:
其中
_complete
包含两次完成器,但第一次时,完成上下文的完成器部分将代替。complete-custom
complete
然后,如果你有:
而不是:
那么
file-patterns
第一个会遵守_complete
,但第二个不会,所以只有在没有其他可能完成的情况下,那些无点的可执行文件才会完成。