【问题标题】:How to auto-save a file every 1 second in vim?如何在vim中每1秒自动保存一个文件?
【发布时间】:2011-08-09 05:12:57
【问题描述】:

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 对于 2021 年的读者:如果您也在使用 Coc.nvim,请阅读我的回答。我是 Vim 专家。

标签: vim autosave


【解决方案1】:

这会在文本更改时保存缓冲区。 (Vim 7.4)

autocmd TextChanged,TextChangedI <buffer> silent write

【讨论】:

  • 为优雅和简约点赞!工作就像微风一样! [需要把这个放在他的_vimrc。]
  • 这并不能真正解决所提出的问题,但它似乎是一个非常好的替代品。这可以标记为解决方案吗?
  • autocmd TextChanged,TextChangedI * silent write 适用于任何缓冲区。
  • 这会破坏以只读模式打开的文件的编辑
【解决方案2】:

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

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

【讨论】:

  • 看来这个功能已经在 Vim 的下一个版本中计划好了(在 Vim 7.3 上 :help autosave 显示来自 todo.txt)。目前我认为没有合适的 autocmd/event 来编写 vimscript 以每秒执行一次保存。但是 Michael 提出的解决方案应该适用于大多数情况,因为即使在不移动光标时它不执行保存,也不太可能在不移动光标的情况下执行任何更改。
  • 在 vim 7.4 中,内置的自动保存功能仍然列在未来版本中要添加的改进之下。
【解决方案3】:

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

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

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

接受的答案会导致自动补全失败。

和平。


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

【讨论】:

    【解决方案4】:

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

    let g:workspace_autosave_always = 1
    updatetime=1000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多