为Makefile

时间:2016-10-21 18:00:40

标签: vim

我要参加的课程要求使用两个空格而不是制表符提交代码。我在.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运行良好时,第二个不会覆盖第一个,并且expandtab将继续设置,即使在Makefile或类型为make的文件上也是如此。无论配置中的顺序如何,都会发生这种情况。

我发现工作的一个有点黑客的解决方案是使用

autocmd FileType make autocmd!

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

augroup filetypedetect
autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
augroup END

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

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

答案 2 :(得分:0)

FileType事件上使用一个autocmd并在BufNewFile,BufRead事件上使用另一个autocmd的问题是事件类型为determines the order in which autocmds are executed,尽管此顺序的定义不是很好。

我选择对两个autocmds使用相同的事件类型。这样,指定它们的顺序就是它们的运行顺序(如vim docs所述,尽管未提及事件类型警告):

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

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