我的.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
时保留这些间距?
如果可能的话,我想在不摆脱autocmd的情况下实现这一目标。这可能吗?
我的预感是,在采购.vimrc
时,我应该以某种方式手动触发FileType事件。这可以做到并且这是推荐的方法吗?
答案 0 :(得分:2)
虽然你已经非常清楚地描述了这个问题,但我怀疑这是否正在发生。
正确使用:setlocal
进行特定于文件类型的设置,以及:set
中使用~/.vimrc
时,后者的来源只会影响全局默认设置(以及当前缓冲区,这是.vimrc
事件期间的BufWritePost
。要影响其他缓冲区,您的:bufdo
中需要.vimrc
命令。
您可以使用
进行检查:verbose set ts? sts? sw? et?
为避免使用全局设置覆盖您的.vimrc
设置,您可以添加以下内容:
if expand('%:t') ==# '.vimrc'
setlocal filetype=vim
endif
答案 1 :(得分:2)
我最终通过将采购autocmd
与另一个autocmd
分组并使用相同的事件来解决此问题
" Reload changes to .vimrc automatically
autocmd BufWritePost ~/.vimrc source ~/.vimrc | setlocal filetype=vim
我之前尝试过这个,但我也使用了vim-airline的AirlineRefresh
命令:
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
答案 2 :(得分:0)
:bufdo e
会这样做,但我无法将其添加到我的.vimrc
。它还将删除不太好的语法突出显示。
:h bufdo
在缓冲区列表
:h :e
重新编辑当前文件