3

语境

我有我的.vimrc自动来源:

自动命令!BufWritePost ~/.vimrc 源码 ~/.vimrc

我还为间距设置了默认值:

set tabstop=2 softtabstop=2 shiftwidth=2 expandtab

稍后,我使用该FileType事件用特定于文件类型的间距覆盖上面的默认间距:

" Syntax of these languages is fussy over tabs & spaces¬
autocmd FileType make setlocal ts=8 sts=8 sw=8 noexpandtab¬
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab¬                                                   

" Customisations based on house-style (arbitrary)
autocmd FileType sh setlocal ts=4 sts=4 sw=4 expandtab
autocmd FileType vim setlocal ts=4 sts=4 sw=4 expandtab

问题

我遇到的问题是采购我.vimrc将设置默认值,但不会触发FileType事件。这意味着当我:write.vimrc 编辑具有文件类型特定间距的文件时对文件执行操作时,文件类型特定间距会被默认值覆盖!

更新:正如 Ingo 所指出的,该问题仅出现在任何其他文件中.vimrc,并且不会出现在任何其他文件中。

例子

例如,当我在我的 . 上工作时.vimrc,最初ts=4 sts=4 sw=4 expandtab启用了特定于文件的.vimrc间距tabstop=2 softtabstop=2 shiftwidth=2 expandtab(该FileType事件不是由对 my 的写入触发的.vimrc)给我留下了默认间距!

我的问题

如何使用特定于文件类型的间距覆盖默认间距并在自动采购时保留这些间距.vimrc

如果可能的话,我想在不摆脱 autocmd 的情况下完成这项工作。那可能吗?

我的直觉是我应该在采购时以某种方式手动触发 FileType 事件.vimrc可以这样做吗?这是推荐的方法吗?

4

3 回答 3

2

我最终通过将采购与具有相同事件autocmd的另一个分组来解决这个问题autocmd

" Reload changes to .vimrc automatically  
autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim

我之前尝试过,但我也使用了vim-airlineAirlineRefresh的命令:

autocmd BufWritePost ~/.vimrc source ~/.vimrc | 航空公司刷新 | 设置本地文件类型=vim

这给了我这个错误:

E488:尾随字符:AirlineRefresh | 设置本地文件类型=vim

切换顺序AirlineRefreshset local filetype=vim修复错误并产生所需的行为:

autocmd BufWritePost ~/.vimrc source ~/.vimrc | 设置本地文件类型=vim | 航空公司刷新
于 2014-08-19T08:05:42.980 回答
2

尽管您已经非常清楚地描述了这个问题,但我怀疑这是否正在发生。

由于您正确地使用:setlocal了文件类型特定的设置,并且:set在您~/.vimrc的 中,后者的采购只会影响全局默认值(以及当前缓冲区,在事件.vimrc期间是您的BufWritePost)。要影响其他缓冲区,:bufdo您的.vimrc.

你可以检查这个

:verbose set ts? sts? sw? et?

为避免您的.vimrc设置被全局设置覆盖,您可以附加以下内容:

if expand('%:t') ==# '.vimrc'
    setlocal filetype=vim
endif
于 2014-08-19T07:15:28.550 回答
0

:bufdo e会这样做,但我不能只是将它添加到我的.vimrc. 它还将删除不太好的语法突出显示。

:h bufdo在缓冲区列表中的每个缓冲区中执行命令

:h :e重新编辑当前文件

于 2014-08-19T04:02:35.213 回答