如何防止全局默认设置在自动源化 .vimrc 时覆盖 'filetype=vim' 特定设置?

3

上下文

我使用以下命令自动加载.vimrc文件:

autocmd! BufWritePost ~/.vimrc source ~/.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事件没有被写入我的.vimrc文件时触发),这让我使用默认间距!

我的问题

如何使用特定于文件类型的间距覆盖默认间距并保留它们,即使自动源化.vimrc文件?

如果可能,我希望在不删除自动命令的情况下完成。这是可能的吗?

我的直觉是,在导入.vimrc文件时应该手动触发FileType事件。这可以做到并且推荐这样做吗?

3个回答

2
尽管您已经非常清楚地描述了问题,但我怀疑这种情况并没有发生。由于您正确地使用了:setlocal进行特定文件类型的设置,以及在~/.vimrc中使用了:set,后者的源代码只会影响全局默认值(以及当前缓冲区,在BufWritePost事件期间是您的.vimrc)。要影响其他缓冲区,您需要在.vimrc中使用:bufdo命令。您可以使用以下命令进行检查:
:verbose set ts? sts? sw? et?

为了避免全局设置覆盖您的.vimrc设置,您可以添加以下内容:
if expand('%:t') ==# '.vimrc'
    setlocal filetype=vim
endif

关于这只发生在<code>.vimrc</code>中的好点子!您的建议起作用了,但它需要放在全局默认声明之下才能工作。 - Pedro Cattori
是的,没错;我觉得这很明显,所以我没有提到它。将其附加到原始的 autocmd(根据您的答案)可能也可以工作;但这可能会导致 :wall 出现问题。 - Ingo Karkat
我对这个还很陌生,所以一开始并不太明显,但回过头来看,现在似乎很明显 :) - Pedro Cattori

2
我通过将源代码autocmd与另一个具有相同事件的autocmd分组来解决了这个问题。
" Reload changes to .vimrc automatically  
autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim

我之前尝试过,但同时使用了 AirlineRefresh 命令来管理 vim-airline,命令如下:

autocmd BufWritePost ~/.vimrc source ~/.vimrc | AirlineRefresh | setlocal filetype=vim

但这导致了以下错误:

E488: Trailing characters:  AirlineRefresh | setlocal filetype=vim

交换 AirlineRefreshset local filetype=vim 的顺序可以解决该错误,并产生预期的行为:

autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim | AirlineRefresh

0

:bufdo e 可以实现这个功能,但我不能将其直接添加到我的 .vimrc 文件中。它还会删除语法高亮,这不是很好。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接