如何在vim中每1秒自动保存文件?

44

我不想知道为什么不应该自动保存或存在swap文件等任何理由来不自动保存。

我只是想在vim中每1秒钟自动保存当前工作文件。

我该如何实现这个功能?


2021年读者注意:如果您也在使用Coc.nvim,请阅读我的回答。我是Vim专家。 - VimNing
另一个插件:https://github.com/907th/vim-auto-save ■ 请注意,下面的大多数解决方案都会在撤销历史记录中创建奇怪的条目。似乎没有好的解决方案,请参考 https://github.com/907th/vim-auto-save/issues/53 -- 尽管对于我的目的(在vim中输入时重新编译Typst),我实际上不需要它写入当前文件,所以我让它写入另一个文件。 - user202729
https://vi.stackexchange.com/questions/74/is-it-possible-to-make-vim-auto-save-files/79#79 提示使用 autocmd CursorHold,CursorHoldI * update - undefined
4个回答

77

每当文本更改时,这将保存缓冲区。(Vim 7.4)

autocmd TextChanged,TextChangedI <buffer> silent write


2
点赞优雅简洁!像风一样顺畅![需要将此放入他的“_vimrc”中。] - llinfeng
这并没有直接解决问题,但它似乎是一个非常好的替代品。可以将其标记为解决方案吗? - philo vivero
autocmd TextChanged,TextChangedI * silent write 适用于任何缓冲区。 - ayorgo
这会破坏以只读模式打开的文件的编辑。 - carbolymer
请查看Eric的回答 - Suuuehgi
显示剩余2条评论

10

开始读取文件时,将缓冲变量设置为当前时间:

au BufRead,BufNewFile * let b:save_time = localtime()

设置一个事件来检查自上次保存以来是否已经足够时间,并在不足时进行更新:

au CursorHold * call UpdateFile()

设置自动保存的时间间隔,以秒为单位:

let g:autosave_time = 1

定义一个函数,如果需要就保存文件:

" save if needed / update the save_time after the save
function! UpdateFile()
  if((localtime() - b:save_time) >= g:autosave_time)
      update
      let b:save_time = localtime()
  else
      " just debugging info
      echo "[+] ". (localtime() - b:save_time) ." seconds have elapsed so far."
  endif
endfunction
然后,要明确重置保存时间:
au BufWritePre * let b:save_time = localtime()

我尚未在 vim 7.0 及以上版本上进行上述测试。另外,仅使用 CursorHold 事件可能不足以实现如此短的自动保存时间(当录制时也不会触发) - 也许你还应该在 CursorMoved 上调用 UpdateFile()

此外,考虑使用交换文件。默认情况下,交换文件在输入200个字符或4秒闲置后开始写入。从交换文件恢复非常简单,而且在出现问题时可能更加可靠。


3
看起来这个功能已经计划在 Vim 的下一个版本中实现了(在 Vim 7.3 中,:help autosave 的说明来自 todo.txt 文件)。目前我认为没有合适的自动命令/事件来编写 Vim 脚本以每秒执行保存。但是 Michael 提出的解决方案应该适用于大多数情况,因为即使在光标未移动时它不执行保存,也不太可能进行任何更改而不移动光标。 - mMontu
2
在vim 7.4中,内置的自动保存功能仍然被列为将来版本要添加的改进之一。 - joelostblom

4

针对2021年的读者和使用CoC.nvim插件的用户

请使用与Coc.nvim兼容的这个:

autocmd InsertLeave * if &readonly==0 && filereadable(bufname('%')) \
                       | silent update | endif

采用被接受的答案将导致自动完成失败。

平安喜乐。


展示一些用户界面,以证明我爱(neo)Vim(-nightly): (可点击,还有其他的可以在我的个人简介中看到。)


3

vim-workspace 插件具有相当可定制的自动保存功能,可能适合您的需要(使用 autoread 可以获得最后编写者胜出的行为)。 您可以将其设置为始终自动保存(默认情况下,它仅在工作区会话期间自动保存),并相应地设置 updatetime。

let g:workspace_autosave_always = 1
updatetime=1000

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