覆盖生成文件的vim autocmd

覆盖生成文件的vim autocmd,vim,Vim,我正在学习的一个类要求提交代码时使用两个空格,而不是制表符。我在.vimrc中有一个autocmd,仅在该类中用于分配的目录中使用两个空格长的选项卡 autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab 但是,我不希望目录中的makefile使用expandtab选项,因为make需要制表符 为此,我在.vimrc中创建了另一个autocmd: autocmd FileType make

我正在学习的一个类要求提交代码时使用两个空格,而不是制表符。我在
.vimrc
中有一个autocmd,仅在该类中用于分配的目录中使用两个空格长的选项卡

autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
但是,我不希望目录中的makefile使用
expandtab
选项,因为make需要制表符

为此,我在
.vimrc
中创建了另一个autocmd:

autocmd FileType make setlocal noexpandtab
但是,尽管第一个autocmd工作正常,但第二个autocmd不会覆盖第一个autocmd,并且将继续设置
expandtab
,即使在makefile或make类型的文件上也是如此。无论配置中的顺序如何,都会发生这种情况

我发现一个有点老套的解决办法是使用

autocmd FileType make autocmd!
这将禁用该文件的所有其他autocmd。但是,这将禁用Makefiles的所有其他autocmd,这是不可取的


是否有其他方法可以使第二个命令优先于第一个命令,或者以某种方式禁用Makefiles上的
expandtab
选项?

白名单通常比黑名单容易得多:

augroup class
    autocmd!
    autocmd BufNewFile,BufRead ~/path/to/dir/*.{foo,bar,baz} set tabstop=2 shiftwidth=2 expandtab
augroup END

如果将配置放在
~/.vim/filetype.vim
而不是
~/.vimrc
中,它可能已经工作了,因为用户自定义在内置
ftplugin/Makefile
之前运行(这会将缩进设置重置为合理的设置):

如果这不起作用,我将向
:autocmd
添加一个条件,而不是定义一个中和秒
:autocmd

autocmd BufNewFile,BufRead ~/path/to/dir/* if &filetype !=# 'make' | set tabstop=2 shiftwidth=2 expandtab | endif

FileType
上使用一个autocmd和在
BufNewFile,BufRead
事件上使用另一个autocmd的问题在于事件类型,尽管这个顺序没有很好地定义

我选择对两个AutoCMD使用相同的事件类型。这样,指定它们的顺序就是它们的运行顺序(如vim docs状态,但没有提及事件类型警告):

makefiles的文件类型检测可能是根据具有事件类型(如
BufRead、BufNewFile、BufEnter
)的AutoCMD定义的,因此您可以将这些规则复制到
.vimrc
中,并对其他规则使用相同的事件类型(可能不是最干净的解决方案)

autocmd BufNewFile,BufRead ~/path/to/dir/* if &filetype !=# 'make' | set tabstop=2 shiftwidth=2 expandtab | endif
set noexpandtab

au BufRead,BufNewFile,BufEnter /some/path/* set expandtab

" Not using FileType since that seems to run before BufRead,BufNewFile,BufEnter
au BufRead,BufNewFile,BufEnter *.go set noexpandtab