Vim:在文件被修改和重新加载后保留历史记录

3
如果我在Vim中编辑文件,然后一些外部程序更改了该文件,Vim会告诉我:
W11: 警告:文件“test.erl”自编辑开始以来已更改
有关更多信息,请参见“:help W11”。
[O]K,(L)oad File:
如果我选择Load文件,那么所有的撤销历史记录都将丢失。
有没有什么方法可以避免这种情况发生?
5个回答

2

1

我不相信这是可能的。

对于vim源码,有一个非常有用的补丁(在此处)可用,可以使退出vim并重新启动后保留撤消历史记录。但是,我刚刚尝试了一下,并且似乎在外部编辑文件时会失败。值得联系作者或在补丁网站上报告错误,以查看是否可以克服此问题。


感谢提供vim-debug链接...我会在列表上询问相关问题 - 谢谢。 - David Wolever
另一个有用的链接是http://repo.or.cz/w/vim_extended.git,它还有一些其他有趣的补丁。 - DrAl

0

这是我在 Vim 7.3 之前使用的一个解决方法:

" :e usually clears undo history, so we don't really do :e any more.
" Instead we delete the contents of the buffer, then read the file in, which
" is an operation we can undo.  We must delete the top (empty) line also.

:map :e<Enter> :%d<Enter>:r<Enter>:0<Enter>dd

当你看到警告提示时,你需要按下ok而不是load,然后自己执行加载::e<Enter>

有两个缺点(尽管我认为这种权衡是可以接受的):

  • 你会失去你所在的行。你的光标停留在文件顶部。
  • Vim仍然认为缓冲区与文件不同步,因此当你下次保存时,你可能需要执行:w!而不是正常的:w,并且你需要按下y来确认覆盖。

编辑:第二个问题可能有解决方法

编辑:第一个问题可以通过更多的脚本编写来解决(参见:h line)。


0

你好,

我不确定设置自动读取,即输入:set autoread是否会在文件更改时保留撤消历史记录?

嗯,我想可能不会,因为更改历史记录是按行号维护的,而vim不知道这些行号是否仍然与更改后的文件相关。

顺便问一下,你为什么要编辑一个正在被外部力量更改的文件呢?听起来对我来说很危险。(-:


1
通过“外部力量”嘿嘿 :-) 我不禁想到达斯·维达远程编辑文件... - Rook
不,autoread实际上只是自动为您按下“L”键的等效操作。 - Peter
我不知道David在尝试做什么,但比如说我写bash脚本时就遇到了这个问题。我写好第一个版本,试图运行它时才意识到我忘记将脚本设置为可执行。如果我在vim中加载文件的同时chmod u+x该脚本,vim会有用地告诉我文件已更改并询问是否重新加载,尽管只是标志位已更改。如果您使用的是像Perforce这样会更改写权限位的源代码控制系统也是一样的。 - Caleb Huitt - cjhuitt
没错 - 这就是完全正确的,@cjhuitt。 - David Wolever

-3

我不明白vim如何跟踪它没有做过的事情。

所以,对于这个问题,我建议使用源代码控制...但这可能不是你想要的答案。


1
为什么不行呢?如果vim认为文件包含一个a,然后有人写入了一个b到文件中,为什么Vim不能撤销那个b呢? - David Wolever
而且...除非我设置一些复杂的方案在Vim中每次更改后提交...否则我不认为源代码控制会有所帮助。 - David Wolever
如果有人删除或移动了文件怎么办?为什么Vim不能恢复它或将其移回去?...这并不简单。Vim使用缓冲原则,即在编辑阶段将文件内容保存到缓冲区中。我相信这就是为什么它会给你重新加载文件的选项(以及为什么它不锁定文件)。@David(第二条评论)-是的。 - Rook
也许我应该再重申一下。如果vim锁定了文件,我想这种情况是可能的。然后他会追踪发生在那个文件上的所有更改。但它没有。Vim为自己制作了一个文件副本,并让文件离开(它没有被锁定)。当您键入:w时,它将缓冲区内容写入文件。为了以那种方式跟踪文件,它需要...好吧,我想你现在已经明白我想说什么了。 - Rook
1
文件消失是一回事...但我不是在问那个 - 我在问的是一个已经被修改过的文件(即,内容已经改变了)。 - David Wolever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接