Neovim - 运行 所有文件类型上的 autcmd EXCEPT

Neovim - run autcmd on all filetypes EXCEPT

我想要这些命令 运行 除了我的 vimwiki 文件(.wiki 和 .md)之外的每个文件类型

以下是我的尝试方式:

let ftToIgnore = ['wiki', 'md']
autocmd BufWinEnter * if index(ftToIgnore, &ft) < 0 | syntax on
autocmd BufWinEnter * if index(ftToIgnore, &ft) < 0 | colorscheme minimalist

它不起作用。 运行在每个文件类型上使用这些命令,包括 wiki/md.

我该如何解决这个问题?

有几件事我们需要弄清楚。

首先,我认为有些命令本质上是 全局的 即使你只有 运行 它用于特定的文件类型,例如上面的 colorscheme 命令是一个全局命令,你不能让它只对一个缓冲区起作用。

为了验证,您可以打开多个不同类型的文件,如果某些文件与您忽略的类型不匹配,colorscheme 命令将 运行。然后对于所有文件,colorscheme 将设置为您选择的主题,即使您没有为忽略的文件类型指定 colorscheme。

其次,在读取文件时不能使用&ft检查文件的文件类型,此时正在进行文件类型检测,还没有确定文件的类型。您可以使用文件后缀来检查文件的类型,如下所示:expand('%:p:e')(这将获取文件的后缀)。

总而言之,您做错了两件事:(1) 使用固有的全局选项或命令并期望它仅适用于特定文件类型 (2) 使用 &ft 来决定文件类型在开幕期间。

如果您使用一些可以是缓冲区本地的选项并更改检测文件类型的方式,您会发现该命令可以是该文件的本地。例如,使用以下 toy.vim 配置:

let suffix_to_ignore = ['md', ]                                                                         
autocmd BufWinEnter * if index(suffix_to_ignore, expand("%:p:e")) < 0 | setlocal tabstop=4 | endif

vim -u toy.vim 激活 vim。然后编辑一个vim文件,:e toy.vimset tabstop?显示tabstop设置为4。打开一个markdown文件,:e test.mdset tabstop?显示tabstop仍然是8. 因此该命令确实只运行 用于除 Markdown 以外的其他文件类型。

参考资料