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

时间:2011-08-09 05:12:58

标签: vim autosave

我不想知道为什么你不应该自动保存,或者有交换文件等或者无法自动保存的原因。

我只想自动保存当前工作文件,以便在vim中每1秒保存一次。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:33)

每当文本发生变化时,都会保存缓冲区。 (Vim 7.4)

autocmd TextChanged,TextChangedI <buffer> silent write

答案 1 :(得分:9)

当您开始阅读文件时,请将缓冲区变量设置为当前时间:

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秒不活动后,交换文件将被写入。如果出现问题,从交换中恢复非常简单,可能更可靠。

答案 2 :(得分:2)

对于 2021 年的读者并且您正在使用 CoC.nvim 插件

使用与 Coc.nvim 兼容的:

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

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

和平。

答案 3 :(得分:1)

vim-workspace插件具有可定制的自动保存功能,可以满足您的需求(使用自动注册功能,因此您可以获得最后一位作者获胜行为)。 您可以将其设置为始终自动保存(默认情况下,它仅在工作区会话中自动保存)并相应地设置更新时间。

let g:workspace_autosave_always = 1
updatetime=1000