2017-09-14 56 views
2

我有一个文件,我想与自己比较。第一个文件是原始文件,第二个文件是正在开发的文件。一种方法是git diff,但不会工作,如果原来的本身已被更改,但尚未上演。另一种方法是在文件系统上复制它并使用diffwatch命令。由于创建和删除临时文件,这不是很有效。用VIM或其他方法比较文件与自己

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

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

实施例:

  1. FILE1.TXT - 原始
  2. 现在此内容在FILE1.TXT改变
  3. 在vim
  4. 负载FILE1.TXT
  5. 该文件的内容被再次改变
  6. 比较3 wih 4.
  7. 该文件的内容被再次更改
  8. 自动比较3与6,可能类似自动刷新。
+0

尝试这种https://stackoverflow.com/questions/16802629/diff-of-current-and-previous-version-using重装到VIM -vim-immilitive – Edwin

+0

@Edwin i shud已经清楚了,这些文件是从vim环境以外改变的。在相关的文章中,修订版是从vim内部维护的。 – infoclogged

+0

和第四步之后没有完成提交,对吧? – Edwin

回答

1

另一种解决方案将是开始:windo diffthis 然后创建一个新的缓冲区(临时文件):vert diffsplit file1.txt~(当你有file1.txt),然后在这个新的缓冲:read file1.txt

+0

对答案的进一步评论在下面写在一个单独的答案中...... – infoclogged

2

在Vim里面,编辑好的文件被读入内存缓冲区。要在某个时间点创建文件内容的“快照”,您可以创建一个新的缓冲区,并使用:%yank | new %.snapshot | put | 1delete _(clobbers默认寄存器)或:let contents = getline(1, '$') | new %.snapshot | call setline(1, contents)(更长)将内容从原始缓冲区复制到该缓冲区, ,或者更舒适地通过我的clone plugin通过:SCloneAs %.snapshot

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

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

2

这是完成埃德温的回答阅读的内容,这不符合评论。

另一种解决方案是加载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命令

+0

你可以在做第一行的dd后使用':set autoread'并且也会给你带来差异 – Edwin

相关问题