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

use*_*488 29 vim autosave

我不想知道为什么你不应该自动保存或有交换文件等或任何不自动保存的原因.

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

我怎样才能做到这一点?

Sam*_*eer 38

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

autocmd TextChanged,TextChangedI <buffer> silent write

  • 为优雅和简约竖起大拇指!工作起来轻而易举![需要将其放入他的 `_vimrc` 中。] (2认同)

Mic*_*kis 9

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

au BufRead,BufNewFile * let b:save_time = localtime()
Run Code Online (Sandbox Code Playgroud)

设置一个事件以检查自上次保存以来是否已经过了足够的时间,如果没有则更新:

au CursorHold * call UpdateFile()
Run Code Online (Sandbox Code Playgroud)

设置自动保存期限,以秒为单位:

let g:autosave_time = 1
Run Code Online (Sandbox Code Playgroud)

定义一个函数来保存文件(如果需要):

" 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
Run Code Online (Sandbox Code Playgroud)

然后,明确重置保存时间:

au BufWritePre * let b:save_time = localtime()
Run Code Online (Sandbox Code Playgroud)

我没有在vim 7.0及更高版本上测试过上述内容.此外,CursorHold事件不太可能足够用于这么小的自动保存期(它也不会在录制时触发) - 也许您也应该调用UpdateFile()CursorMoved.

另外,请考虑使用交换文件.默认情况下,在输入200个字符或4秒不活动后,交换文件将被写入.从交换中恢复非常简单,并且可能更加可靠,以防出现问题.

  • 似乎已经为下一版本的Vim计划了这个功能(在Vim 7.3`上:帮助自动保存`从`todo.txt`显示).目前我认为没有合适的autocmd/event来编写vimscript来执行每秒保存.但是迈克尔提出的解决方案应该适用于大多数情况,因为即使不移动光标时它也不执行保存,所以如果不移动光标,您很可能不会执行任何更改. (3认同)
  • 在vim 7.4中,内置自动保存功能仍在改进之列,以便在将来的版本中添加. (2认同)