繁體中文

開發者工具 · 文字比較

在逐行文本差異中「忽略空白」真正忽略了什麼

· 工作原理

文字差異 開發人員工作流程 空白

與縮排變更對齊的兩個文字修訂已減弱,但內容編輯得以保留
原始 ToolAcre 向量圖

分解比較可以規範化的空白類型,從前導縮排到內部運行,並警告空白具有意義且不應被忽略的地方。

每一行都改變了,但沒有真正改變——打開一個文件,文件從製表符重新縮進到空格,顯示為差異之牆

格式化程式將四個空格縮排更改為兩個空格,行差異將整個檔案繪製為更改後的樣子。更改可能是視覺噪音,因此對空白不敏感的視圖可以幫助審查者找到實際的編輯。但「沒有空格的相同文字」與「相同程式」不同。在批准配置或來源文件之前,將普通視圖和規範化視圖進行比較。

四種空白差異-分隔前導縮排、尾隨空格、內部運作和空行,因為每一種都是由不同的工具或習慣引起的

空白更改發生在多個地方。前導縮排通常來自格式;複製/貼上的尾隨空格;行內重複的空格或製表符可能會分隔單字或列;空白行可以劃分區塊。 ToolAcre 的忽略空白選項會修剪每一行並將每個內部空白行折疊為空格以進行比較。它不會簡單地刪除所有空白或將不同的行數視為相同:兩個空白行仍然是兩個比較單元,除非另一個操作將其刪除。

比較之前標準化是如何發生的 - 解釋了該選項將每一行轉換為規範形式以進行匹配,而您的原始文本就是您所閱讀的內容

行鍵是在匹配之前根據原始文字計算的:trim() 刪除前導/尾隨空格,正則表達式用一個空格替換內部運行。 diff 演算法比較鍵,但將原始文字保留在顯示的行中。在建構 LCS 表之前,公共前綴和後綴會被丟棄,因此大型文件中的小編輯不一定需要將每一行與其他行進行比較。存在 2,000 個不同行的上限,因為動態規劃表的兩側長度都會增加。

工作範例:重新縮排的 Python 函數和 YAML 檔案 - 顯示清理 Python 視圖的選項,然後隱藏實際上改變文件結構的 YAML 縮排更改

想像一個 Python 函數,其整個函數體從四個空格變成兩個空格,同時保持相同的巢狀層級。忽略縮排可以隱藏格式雜訊。在 YAML 中,將鍵從 services.web 下面移動到 services 下面會變更其父映射,即使在修剪空白後每行的字元都是相同的。在兩個片段上運行該選項:Python 視圖可能會變得更容易查看,而 YAML 變更可能會消失,儘管更改了資料樹。切勿單獨使用空白不敏感輸出來批准縮排敏感格式。

當空格是資料 — 列出空格具有意義的格式:YAML、Makefile、Markdown 程式碼區塊、固定寬度匯出和字串文字

空格是 YAML 縮排、Makefile 配方、Markdown 程式碼區塊和固定寬度匯出中的資料。在字串文字中,替換多個空格可以更改使用者可見的文字或正在簽名或散列的值。即使具有通常靈活格式的程式碼也具有空格很重要的上下文:Python 區塊和 shell here-documents 就是明顯的例子。這個選項無法推斷這些上下文,因為它看到的是簡單的線條,而不是語言語法。僅當您了解所比較的文件時才選擇它。

結合空格和大小寫選項 - 描述啟用兩者如何縮小與相同順序的相同字母的比較範圍以及隱藏的內容

將「忽略空白」與「忽略大小寫」結合可將符合範圍縮小到其餘字母和標點符號一致的行,而無需考慮大小寫或間距。這可能會使格式繁重的文件變得安靜,但它也可以隱藏更改後的區分大小寫的識別碼、標頭鍵或檔案系統路徑。只有當您開啟第二個選項時,ToolAcre 才會小寫比較鍵;它仍然顯示原始行文字。一次切換一個選項,這樣您就可以看到每個選項刪除了哪些變更。

這不包括什麼——該選項比較標準化後的行;它不會重排段落、檢測移動的區塊或比較豐富文件中的格式

此功能不會重排段落、偵測移動的區塊、比較 HTML 渲染或確定兩個程式 AST 是否等效。 ToolAcre 的 diff 是基於行的 LCS 動態規劃,具有公共前綴/後綴修剪,而不是一些通用 diff 教程中描述的 Myers 演算法。在大型貼上檔案上,它將停止而不是分配無界矩陣。使用語言感知解析器或版本控制審查來進行結構聲明。

重點:切換它,不要預設它 - 建議運行兩種比較,並展示 ToolAcre 的文字比較如何讓您為同一對文字開啟和關閉空白選項

Toggle 將忽略空格作為視圖,而不是預設事實。文字比較會保留您在瀏覽器中貼上的所有內容,讓您可以比較相同修訂版的兩個視圖,而無需上傳合約或個人資料。如果變更在規範化視圖中消失,請先詢問基礎格式是否賦予空白意義,然後再確定它是無害的。