VIM:我如何定期(自动)保存当前工作文件的备份副本?

时间:2015-05-22 14:11:37

标签: vim

我是一个相对绿色的vim用户,我现在使用的是,通过其他vim相关帖子的所有迹象,这是一种相当简单的方式。我希望我的问题有一个同样简单的答案,但是我找不到多少运气。无论如何这是我的问题:

仍然有点新的vim有时候,由于错误的键击或命令序列,我告诉vim做一些完全出乎意料的事情(删除一行,跳转,进入一个奇怪的菜单事物等) 。
当发生这种情况时,我通常可以撤消或:q!我可以根据需要解决问题,以确保文件不会受到意外更改的影响。

然而,昨晚我正在编辑一个包含几百行源代码的文件,我进入了其中一个小的vim apoplexies,可能是因为错误地将大写锁定了。
因为我这是一个习惯性的增量工作保护程序,我知道我最近会做的:我觉得很好地退出vim而不再保存文件。
问题解决了,对吧?错误。当我尝试重新打开文件时,我收到shell的错误,说该文件无法找到,果然它已经消失了!
幸运的是(但非常不寻常),在发生这种情况之前,我已经将我的源码保存到了一个重复的“.copy”文件中,所以最后我失去了五分钟的工作时间。然而,不用说,我再次发生这种情况的可能性让我感到不安。
所以,如果你能帮助我,我想知道的是:

  1. 是否有一种简单的方法可以自动设置vim,定期将我当前正在处理的文件保存为单独的文件作为备份(例如<file>.c.copy),同时继续使用原始文件打开文件?
  2. (易于实施是我在这一方面的关键因素。如果解决这个问题的建议要求我将大量时间或注意力从我目前的项目转移到学习vim编程或实现高度深奥的聪明,我想我可能现在只能手动:w <file>.c.copy,直到我有更多时间来掌握其狡猾的方式。)

    1. 奖金问题:我到底是怎么做到的??我还是不知道。我想是魔术手指。 =)
    2. (VIM版本7.4.459,如果有帮助的话)

2 个答案:

答案 0 :(得分:1)

我会尝试用另一种方法解决您的问题:撤消您所做的任何意外更改,并避免:q!

大部分时间点击 u 都应撤消您的更改。但我假设您有时会点击随机键,这使得很难仅使用 u 撤消意外更改(例如:代码确定 - &gt;意外键撤消好代码的一部分然后插入废话文本)。由于vim具有撤消树(检查:h undo-branches),因此仍然可以在不使用:q!的情况下恢复正确的版本。某些插件(例如undotree)可让您轻松导航到撤消历史记录中的所有版本。

对于第二个问题,您可能输入了一些删除当前文件的系统命令,例如:!rm %。但是如果你在撤消混乱并且再次保存文件后没有退出vim(:w)你将不会丢失你的文件(除非你设法用你的意外打字退出vim,但这可能是非常不寻常的 - 如果您设置了'undofile',则仍有可能恢复您的文件 - 请检查:h persistent-undo)。

答案 1 :(得分:0)

我为自己解决了这个问题,这些毫无疑问是不完美的vimrc行

"----- backup ------------------------------------------------------
" this is a default. to be updated per file type
autocmd BufNewFile,BufNew,BufRead * let b:buDir = "/work/BACKUP/vimBackups/all/"
" this is a default, to be updated per file type
au BufNewFile,BufNew,BufRead * let b:buFilename = "some_unsaved_file"        
au            BufNew,BufRead * let b:buFilename = expand('%:t')             " ideal

" from help BufNew:
"   NOTE: When this autocommand is executed, the
"   current buffer "%" may be different from the
"   buffer being created "<afile>".

" the backup command
" currently, overwrite whatever is there: a new file will be made each second
" if necessary
autocmd VimLeavePre,BufWritePre * silent execute ":write! >> ".b:buDir."vim_bu_".strftime('%Y-%b-%d__%H:%M:%S')."_".b:buFilename.".bu.txt "

然后,在我有个别文件类型的部分

let b:buDir = "/work/BACKUP/vimBackups/email/"

let b:buDir = "/work/BACKUP/vimBackups/coding/"

let b:buDir = "/work/BACKUP/vimBackups/text/"

并且......你明白了。

我在脚本中有一行由anacron运行,清除旧备份:

find $VIM_BU_DIR -not -newerat "1 month ago" -delete;