如何防止全局默认值在自动获取 .vimrc 时覆盖 .vimrc 中的'filetype=vim'特定设置?



上下文

我的.vimrc自动来源于:

自动CMD!BufWritePost ~/.vimrc source ~/.vimrc

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

设置制表位=2 软制表位=2
移位宽度=2 展开制表符

稍后,我使用 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事件。这意味着,当我在编辑具有文件类型特定间距的文件时对.vimrc执行:write时,特定于文件类型的间距会被默认值覆盖!

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

例如,当我在处理我的.vimrc时,最初启用了特定于文件的间距(ts=4 sts=4 sw=4 expandtab(,但是在我对.vimrc进行一些任意更改后,默认间距(tabstop=2 softtabstop=2 shiftwidth=2 expandtab(被加载,但我的文件特定间距没有加载(因为FileType事件不是由写入我的.vimrc触发的(,给我留下了默认间距!

我的问题

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

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

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

虽然你已经非常清楚地描述了这个问题,但我怀疑这种情况是否正在发生。

由于您正确地将:setlocal用于特定于文件类型的设置,并且:set ~/.vimrc,因此后者的源只会影响全局默认值(以及当前缓冲区,这是您在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

我之前尝试过这个,但我也在使用 vim-airline 的 AirlineRefresh 命令:

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

这给了我这个错误:

E488:尾随字符:航空公司刷新 | 设置本地文件类型=vim

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

autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim |航空公司刷新

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

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

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

相关内容

  • 没有找到相关文章

最新更新