38

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

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

我怎样才能做到这一点?

4

4 回答 4

69

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

autocmd TextChanged,TextChangedI <buffer> silent write

于 2014-12-09T19:23:51.317 回答
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 事件对于这么短的自动保存时间不太可能足够(它在录制时也不会触发)——也许您也应该调用UpdateFile()CursorMoved。

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

于 2011-08-09T05:23:36.067 回答
4

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

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

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

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

和平。


展示一些 UI 来证明我喜欢 (neo)Vim(-nightly):(可点击,许多其他人看到我的个人资料介绍。)

于 2021-05-03T13:47:39.127 回答
1

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

let g:workspace_autosave_always = 1
updatetime=1000
于 2017-02-07T14:29:02.393 回答