在VIM或任何其他方法中比较文件与自身

时间:2017-09-14 10:13:35

标签: git vim

我有一个我想与自己比较的文件。第一个文件是原始文件,第二个文件是正在开发的文件。一种方法是echo,但是如果原始本身已经改变而没有上演,那么它将无法工作。另一种方法是在文件系统上复制它并使用git diffdiff命令。由于临时文件的创建和删除,这并不高效。

我想在VIM中尝试watch命令。 VIM可以将文件作为缓冲区存储在内存中,因此我的问题是我应该怎么做?

请注意,文件不会在vim环境中更改,而是从外部编辑器更改。

示例:

  1. file1.txt - 原始
  2. 此内容现已在file1.txt
  3. 中更改
  4. 在vim中加载file1.txt
  5. 文件内容再次更改
  6. 比较3 wih 4.
  7. 文件内容再次更改
  8. 自动将3与6进行比较,可能就像自动刷新一样。

3 个答案:

答案 0 :(得分:2)

在Vim内部,编辑过的文件被读入内存缓冲区。要在某个特定时间点创建文件内容的“快照”,您可以使用#import <Foundation/Foundation.h> #import "JSONModel.h" @protocol Video @end @interface Video : JSONModel @property (strong, nonatomic) NSArray *youtube; @end (默认寄存器)来创建新缓冲区,并将原始缓冲区中的内容复制到该缓冲区,或者:%yank | new %.snapshot | put | 1delete _(更长),或通过:let contents = getline(1, '$') | new %.snapshot | call setline(1, contents)通过:SCloneAs %.snapshot更加轻松。

使用:set autoread,原始缓冲区将自动更新为在Vim之外进行的任何更改。然后,您可以通过:windo diffthis对两个窗口进行区分,并使用:diffupdate更新差异(如果需要)。

当然,您也可以通过:SCloneAs %.snapshot2创建新的快照;通过:bdelete删除快照。

答案 1 :(得分:2)

这是为了完成Edwin的回答,这不符合评论。

另一种解决方案是加载test.yml vim test.yml然后加载:windo diffthis。 然后创建一个新缓冲区(临时文件):vert diffsplit test_original.yml,然后读取此新缓冲区:read test.yml中的内容。

此时你应该有两个窗口 - 一个用test_original.yml,另一个用test.yml。你必须删除test_original.yml中的第一行(dd),因为read附加到文件,因此有一个额外的行。这里的问题是vim将所有行标记为已更改。

enter image description here

要解决此问题,请再次运行:diffoff :windo diffthis。现在你只能看到一行。

最后,在test.yml外部进行更改,如果要查看更改,请运行:edit,现在您应该只看到原始文件和更改文件之间的更改。

enter image description here

一旦结束,就用qa退出!由于没有写入test_original.yml(w),因此没有对文件系统进行复制。

外部的后续更改必须使用:edit:checktime命令重新加载到vim中

答案 2 :(得分:1)

另一个解决方案是启动:windo diffthis 然后创建一个新缓冲区(临时文件):vert diffsplit file1.txt~(当你有file1.txt时)然后读取这个新缓冲区中的内容:read file1.txt