【问题标题】:Comparing files with itself in VIM or any other method在 VIM 或任何其他方法中将文件与自身进行比较
【发布时间】:2017-09-15 00:02:44
【问题描述】:

我有一个文件,我想与它自身进行比较。第一个文件是原始文件,第二个文件是正在开发的文件。一种方法是git diff,但如果原件本身已更改且尚未上演,则该方法不起作用。另一种方法是在文件系统上复制它并使用diffwatch 命令。由于临时文件的创建和删除,这效率不高。

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

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

例子:

  1. file1.txt - 原始
  2. 此内容现在在 file1.txt 中进行了更改
  3. 在vim中加载file1.txt
  4. 文件内容再次更改
  5. 比较 3 和 4。
  6. 文件内容再次更改
  7. 自动比较 3 和 6,可能类似于自动刷新。

【问题讨论】:

  • @Edwin 我很清楚,文件是从 vim 环境之外更改的。在相关帖子中,修订是从 vim 内部维护的。
  • 第四步之后就没有提交了,对吧?
  • @Edwin 整个过程没有提交。此外,有问题的文件也可能不受版本控制。

标签: git vim


【解决方案1】:

在 Vim 内部,已编辑的文件被读入内存缓冲区。要在某个时间点创建文件内容的“快照”,您可以创建一个新缓冲区,然后使用:%yank | new %.snapshot | put | 1delete _(默认寄存器)或@987654323 将原始缓冲区中的内容复制到其中@(更长),或者更舒适地通过我的clone plugin 通过:SCloneAs %.snapshot

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

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

【讨论】:

    【解决方案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 将所有行标记为已更改。

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

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

    结束后,只需使用 qa! 退出即可。由于尚未写入 test_original.yml ( w ),因此未在文件系统上制作副本。

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

    【讨论】:

    • 您可以在执行第一行的dd 后使用:set autoread,也会得到差异
    【解决方案3】:

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

    【讨论】:

    • 对答案的进一步解释写在下面的单独答案中......
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2016-07-29
    • 2023-03-15
    相关资源
    最近更新 更多