Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:在文件被更改和重新加载后维护其历史记录_Vim - Fatal编程技术网

Vim:在文件被更改和重新加载后维护其历史记录

Vim:在文件被更改和重新加载后维护其历史记录,vim,Vim,如果我在Vim中编辑一个文件,那么一些外部程序会更改该文件,Vim告诉我: W11: Warning: File "test.erl" has changed since editing started See ":help W11" for more info. [O]K, (L)oad File: W11:警告:文件“test.erl”自编辑开始以来已更改 有关更多信息,请参阅“:help W11”。 [O] K,(L)加载文件: 但是,如果我Load该文件,则所有撤消历史记录都将丢失 有什

如果我在Vim中编辑一个文件,那么一些外部程序会更改该文件,Vim告诉我:

W11: Warning: File "test.erl" has changed since editing started See ":help W11" for more info. [O]K, (L)oad File: W11:警告:文件“test.erl”自编辑开始以来已更改 有关更多信息,请参阅“:help W11”。 [O] K,(L)加载文件: 但是,如果我
L
oad该文件,则所有撤消历史记录都将丢失


有什么办法可以避免这种情况吗?

我不知道vim如何跟踪它没有做的事情

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

G'day

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

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


顺便说一句,你正在编辑一个被外力改变的文件吗?听起来对我很危险。(:

我认为这是不可能的


vim源代码有一个非常有用的补丁,可以在退出vim并重新启动后保留撤消历史记录。但是,我刚刚尝试了它,当文件在外部编辑时,它似乎失败了。可能值得联系作者或在补丁网站上报告一个bug,看看这是否可以克服。

updatee:这似乎是Vim 7.3中的新特性之一:

这是我在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
”:e通常会清除撤消历史记录,因此我们不再真正执行:e。
“相反,我们删除缓冲区的内容,然后读取其中的文件
“是一个可以撤消的操作。我们还必须删除顶部(空)行。”。
:映射:e:%d:r:0dd
当您看到警告提示时,您必须点击
o
k而不是
l
oad,然后自己执行加载:
:e

有两个缺点(尽管我认为折衷是可以接受的):

  • 您丢失了原来所在的行。光标位于文件顶部
  • Vim仍然认为缓冲区与文件不同步,因此下次保存时,可能需要执行
    :w!
    ,而不是正常的
    :w
    ,并且需要点击
    y
    以确认覆盖
编辑:可能有


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

为什么不呢?如果vim认为文件包含
a
,那么有些人会将a
b
写入文件,为什么vim不能撤消该
b
?并且…除非我在vim中每次更改后都设置一些复杂的提交方案…我看不到源代码管理会有什么帮助。如果有人删除或移动该文件,为什么uldn Vim无法取消删除它/或将其移回?…这并不是那么简单。Vim使用缓冲区原则,即在编辑阶段将文件内容保存到缓冲区。我相信这就是为什么它给了您再次加载文件的选项(以及为什么它不锁定文件)。@David(第二条评论)-是的。也许我应该重申一点。如果vim锁定了文件,我想类似的事情可能会发生。然后他会跟踪该文件发生的所有更改。但事实并非如此。vim会为自己创建一个文件副本,并让该文件离开(未锁定)。当您:w时,它会写入副本(缓冲区)一个文件的内容。为了以这种方式跟踪一个文件,它需要…好吧,我想你已经收集了我现在想说的。文件消失是一回事…但我不是问这个-我是问一个被修改的文件(即,内容已被更改)。通过“外力”呵呵:-)我忍不住想到达斯·维德远程编辑一个文件……不,自动读取实际上相当于为您自动按
L
。我不知道大卫想做什么,但我在写bash脚本时遇到过这种情况。我做了我的第一个版本,试着运行它,然后意识到我忘记了设置script作为可执行文件。如果在vim中加载文件时我chmod u+x脚本,vim将告诉我文件已更改,并提供加载它,即使只有标志已更改。如果您使用的源代码管理系统像Perforce一样处理写入权限位,这也是一样的。是-就是这样,@cjhuitt.Thank这是vim调试链接…我将在列表中询问这个问题-谢谢。另一个有用的链接是它还有一些其他有趣的补丁。