2017-09-14 62 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

相關問題