繁体   English   中英

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

[英]How to prevent global defaults from overriding 'filetype=vim' specific settings in .vimrc when automatically sourcing .vimrc?

上下文

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

更新 :如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 ,后者的采购只会影响全局默认值(和当前的缓冲区,这是你.vimrc期间BufWritePost事件)。 要影响其他缓冲区,需要在.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-airlineAirlineRefresh命令:

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

这给了我这个错误:

E488: Trailing characters:  AirlineRefresh | setlocal filetype=vim

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM