如何防止全局默认值覆盖';filetype=vim';自动寻源.vimrc时.vimrc中的特定设置? 上下文

如何防止全局默认值覆盖';filetype=vim';自动寻源.vimrc时.vimrc中的特定设置? 上下文,vim,autocmd,Vim,Autocmd,我的.vimrc自动来源于: autocmd! BufWritePost ~/.vimrc source ~/.vimrc 问题 我遇到的问题是,sourcing my.vimrc将设置默认值,但不会触发文件类型事件。这意味着,当我在编辑具有特定于文件类型间距的文件时,对我的.vimrc执行:写入时,特定于文件类型的间距将被默认值覆盖 更新:正如国际非政府组织所指出的,该问题只出现在.vimrc中,不会出现在任何其他文件中 例子 例如,当我在处理我的.vimrc时,最初会启用特定于文件的间距(t

我的
.vimrc
自动来源于:

autocmd! BufWritePost ~/.vimrc source ~/.vimrc 问题 我遇到的问题是,sourcing my
.vimrc
将设置默认值,但不会触发
文件类型
事件。这意味着,当我在编辑具有特定于文件类型间距的文件时,对我的
.vimrc
执行
:写入
时,特定于文件类型的间距将被默认值覆盖

更新:正如国际非政府组织所指出的,该问题只出现在
.vimrc
中,不会出现在任何其他文件中

例子 例如,当我在处理我的
.vimrc
时,最初会启用特定于文件的间距(
ts=4 sts=4 sw=4 expandtab
),但在我对
.vimrc
进行一些任意更改后,默认间距(
tabstop=2 softtabstop=2 shiftwidth=2 expandtab
)已加载,但未加载我的文件特定间距(因为写入我的
.vimrc
时未触发
文件类型
事件),使我保留默认间距

我的问题 如何使用特定于文件类型的间距覆盖默认间距,并在自动寻源
.vimrc
时保留这些间距

如果可能的话,我想在不摆脱autocmd的情况下实现这一点。可能吗


我的直觉是,我应该在寻找
时手动触发文件类型事件。vimrc
可以这样做吗?这是推荐的方法吗?

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

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


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

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

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

你可以跟我核对一下

:verbose set ts? sts? sw? et?
为避免您的
.vimrc
设置被全局设置覆盖,您可以附加以下内容:

if expand('%:t') ==# '.vimrc'
    setlocal filetype=vim
endif

我最终解决了这个问题,将采购
autocmd
与另一个
autocmd
分组,并使用相同的事件

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

我之前已经尝试过,但我也使用了
AirlineRefresh
命令:


只有在
.vimrc
中才会出现这种情况,这是一个好的观点!您的建议有效,但需要在
.vimrc
文件中降低全局默认声明的有效性;我认为这是显而易见的,所以我没有提及。将此附加到原始autocmd(根据您的回答)可能也会起作用;这可能会导致
:wall
出现问题。我对这一点还不太熟悉,所以这一点并不是很明显,但现在回想起来,它确实很明显:)
if expand('%:t') ==# '.vimrc'
    setlocal filetype=vim
endif
" Reload changes to .vimrc automatically  
autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim
autocmd BufWritePost ~/.vimrc source ~/.vimrc | AirlineRefresh | setlocal filetype=vim E488: Trailing characters: AirlineRefresh | setlocal filetype=vim autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim | AirlineRefresh