【发布时间】:2011-08-09 05:12:57
【问题描述】:
我不想知道为什么你不应该自动保存或有交换文件等或任何不自动保存的原因。
我只是想自动保存当前工作文件,以便在 vim 中每隔 1 秒保存一次。
我怎样才能做到这一点?
【问题讨论】:
-
对于 2021 年的读者:如果您也在使用 Coc.nvim,请阅读我的回答。我是 Vim 专家。
我不想知道为什么你不应该自动保存或有交换文件等或任何不自动保存的原因。
我只是想自动保存当前工作文件,以便在 vim 中每隔 1 秒保存一次。
我怎样才能做到这一点?
【问题讨论】:
这会在文本更改时保存缓冲区。 (Vim 7.4)
autocmd TextChanged,TextChangedI <buffer> silent write
【讨论】:
_vimrc。]
autocmd TextChanged,TextChangedI * silent write 适用于任何缓冲区。
开始读取文件时,将缓冲区变量设置为当前时间:
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 秒不活动后写入交换文件。从交换中恢复非常简单,也许更可靠,以防出现问题。
【讨论】:
:help autosave 显示来自 todo.txt)。目前我认为没有合适的 autocmd/event 来编写 vimscript 以每秒执行一次保存。但是 Michael 提出的解决方案应该适用于大多数情况,因为即使在不移动光标时它不执行保存,也不太可能在不移动光标的情况下执行任何更改。
vim-workspace 插件具有相当可定制的自动保存功能,可以满足您的需求(使用自动读取功能,您可以获得最后一位作家获胜的行为)。 您可以将其设置为始终自动保存(默认情况下,它仅在工作区会话中自动保存)并相应地设置更新时间。
let g:workspace_autosave_always = 1
updatetime=1000
【讨论】: