无需插件实现Vim自动保存:解决会话模式下配置失效问题
这问题我之前也碰到过!核心原因是你写的<buffer>局部自动命令其实只对vimrc加载时的那个空缓冲区生效,后续打开的文件(包括会话加载的缓冲区)根本没带上这个规则——毕竟手动输入命令时,你已经打开了目标文件,<buffer>指向的是当前编辑的文件缓冲区,自然能生效,但写入vimrc就不一样了。
下面给你两个靠谱的解决方案,都能让自动保存在会话模式下正常工作:
方案1:全局自动命令(简单直接)
用自动命令组包裹全局规则,确保所有符合条件的缓冲区都能触发自动保存,而且会话加载后不受影响:
augroup AutoSave " 先清空组内已有命令,避免重复注册 autocmd! " 文本内容改变时(普通/插入模式)自动保存,加条件过滤不必要的缓冲区 autocmd TextChanged,TextChangedI * \ if &modifiable && &filetype !=# 'help' && &filetype !=# 'terminal' | \ silent write | \ endif augroup END
这里的条件可以按需调整:
&modifiable确保只对可编辑的文件生效,只读文件不会触发;- 排除
help和terminal类型的缓冲区,避免给帮助文档或终端窗口做无用的保存; silent关键字让保存操作静默执行,不会弹出提示打断你的编辑。
方案2:缓冲区局部命令(精准控制)
如果你想给每个缓冲区单独设置自动保存(方便临时关闭某个文件的自动保存),可以通过BufEnter事件动态给每个进入的缓冲区添加局部规则:
augroup AutoSaveBuffer autocmd! " 每次进入缓冲区时,为符合条件的文件添加局部自动保存命令 autocmd BufEnter * \ if &modifiable && &filetype !=# 'help' && &filetype !=# 'terminal' | \ autocmd TextChanged,TextChangedI <buffer> silent write | \ endif augroup END
要是某天你想临时关掉当前文件的自动保存,只需要执行:autocmd! TextChanged <buffer>就能取消该缓冲区的规则,非常灵活。
为什么会话加载时现在能生效?
Vim加载会话的顺序是先读vimrc的全局配置,再加载会话文件的缓冲区状态。而默认情况下,会话文件不会保存或覆盖全局的自动命令组,所以我们设置的规则会自动应用到会话里的所有缓冲区。如果你担心会话影响,还可以确认sessionoptions不包含autocmd(这是默认设置),彻底让vimrc掌控自动保存逻辑。
内容的提问来源于stack exchange,提问作者user395980
相关产品推荐
相关产品推荐

