首页 > 解决方案 > Neovim - run autcmd on all filetypes EXCEPT

问题描述

I want these commands run on every filetype except my vimwiki file (.wiki and .md)

Here is how I'm trying to do it:

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

It is not working. It is running these commands on every single filetype, including wiki/md.

How can I fix this?

标签: vimneovim

解决方案


有几件事我们需要明确。

首先,我认为一些命令本质上是全局的,即使你只为特定的文件类型运行它,例如,上面的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 vim -u toy.vim。然后编辑一个vim文件,:e toy.vim显示set tabstop?tabstop设置为4。打开一个markdown文件,:e test.md显示set tabstop?tabstop仍然是8。所以该命令确实只针对Markdown以外的其他文件类型运行。

参考


推荐阅读