一些文字处理程序和文本编辑器会不时自动保存我们正在编辑的文件,这对于从严重的崩溃中幸存下来非常方便。

有没有办法使Vim自动保存在特定间隔后我们的文件?

#1 楼

没有内置选项,尽管:help 'autosave'(在todo.txt中)指的是这种选项可以做什么的描述。

实现此功能的一种可能方法是使用CursorHold自动命令事件。当用户未按'updatetime'毫秒的键时触发此事件。

autocmd CursorHold * update


:update命令仅在修改缓冲区后保存。如果您还希望在插入模式处于活动状态时发生这种情况,可以将CursorHoldI添加到事件列表中。

autocmd CursorHold,CursorHoldI * update


另一种选择是'autowrite'选项,该选项可以保存在执行外部命令(用于在运行:make之前保存)或切换到其他缓冲区之前使用缓冲区。

评论


您如何知道它是否正常工作?

–尼龙
18年6月8日在13:53

@nilon它应该打印到已保存的状态栏中,就像您自己按:w一样。

– MaudPieTheRocktorate
18年8月16日在19:33

#2 楼

Vim确实具有自动保存功能,但会将其保存到“恢复”文件中。

编辑文档时,例如qvim将创建修复文件MyFile.txt。如果您的系统崩溃了,或者会话崩溃了,那么您可以键入以下内容重新连接并从中断的地方恢复:

vim -r MyFile.txt


这将打开文件进行编辑,然后恢复对它所做的最后更改。

然后您可以按正常方式保存恢复的版本.MyFile.txt.swp

,当您退出vim时,它将留下:w,您需要手动将其删除:

rm .MyFile.txt.swp


请参见“恢复”手册页
第11章

评论


正确退出Vim时(即使用:wq或:q!或ZZ等退出),应自动删除交换文件。

–门把手
2015年2月3日在22:52

@Doorknob在您康复后退出时不是... ;-)

–rolfl
2015年2月3日在22:52

#3 楼

我制作了一个插件vim-autosave,它使用Timers的Vim 8功能来定期保存您的缓冲区。

评论


哇,Vim 8插件已经问世了。看起来不错,基督徒!

– thameera
16/09/13在18:18

谢谢,克里斯蒂安。这看起来很有希望。我不知道插件是否支持新的/未保存的文件。我在插件文档中找不到答案。我的计算机决定昨晚重新启动,我在新缓冲区上有几条快速笔记。 Vim没有创建或保存swp文件。

– JAponte
16-10-14在17:53



不,目前,它不支持新文件/未保存的文件。如果需要,继续创建一个白色的问题。

–克里斯蒂安·布拉班特(Christian Brabandt)
16-10-14在18:10

#4 楼

正如其他人指出的那样,vim有一个交换文件(.swp),该文件将在原始文件所在的位置创建,但是在您的.vimrc文件中,您可以设置.swp目录。

您需要使用mkdir创建目录,然后将.vimrc设置到该位置。

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp


#5 楼

我让Vim每次失去焦点时都保存所有内容。

autocmd FocusLost <your-patterns-here> silent! wall


我的模式很长,我在多个autocmd中使用它们,但是为了完整起见:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END


#6 楼

vim-workspace插件具有相当可定制的自动保存功能,可以满足您的需求。默认情况下,它在工作区会话中启用自动保存(它的主要功能),但是如果您要查找的全部内容,则可以将其设置为始终自动保存(let g:workspace_autosave_always = 1)。

#7 楼

尝试在更改文本时保存缓冲区:

autocmd TextChanged,TextChangedI <buffer> silent write


这对我有用。



#8 楼

将此放在您的vimrc上:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => vim-autosave 
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Save on lost focus/exit 
autocmd FocusLost,VimLeavePre * silent! w

" Also, save once per minute if there are changes
let g:autosave_seconds = 60 
au BufRead,BufNewFile * let b:start_time=localtime()
au CursorHold * silent! call UpdateFile()
function! UpdateFile()
  if ((localtime() - b:start_time) >= g:autosave_seconds)
    update
    let b:start_time=localtime()
  endif
endfunction
au BufWritePre * let b:start_time=localtime()



评论


欢迎来到Vi和Vim!有一些解释,这个答案会更强

– D. Ben Knoble♦
20-11-06在16:23

这段代码可以将您的缓冲区保存在失去焦点/退出时。此外,如果有更改,则每分钟保存一次。您可以通过编辑常量“ autosave_seconds”来配置自动保存间隔。

– Adrian Lopez
20-11-06在16:44

使用编辑按钮添加更多信息

– D. Ben Knoble♦
20年11月6日在16:45

#9 楼

实现自动备份的间接方法是启用set undofile。即使已关闭文件并退出vim,打开的文件的每次更改都保存在此处,具有多个撤消级别。我认为它非常实用,比自动保存要好。