第三部・進階功能 / 3.4

雙欄檔案比對

按 F4 選左右兩個檔案並排比對,差異會先對齊再標色,還可以把差異區塊左右互抄。所有修改都先寫在暫存副本上,原始檔案要等你確認才會被蓋掉。

閱讀時間 約 14 分鐘 對象 要比檔案的人 先備知識 2.1 版本 v1.0 ・ 2026-08-26
3.4.1

進入比對

F4,然後用同一個檔案對話盒選兩次。

  1. 按 F4。第一列顯示「選擇左側檔案」,操作方式跟開檔完全一樣(見 2.1.2)。
  2. 選左邊那個檔。訊息列說「已選左側:/etc/nginx/nginx.conf;請選擇右側檔案」,第一列換成「選擇右側檔案」。
  3. 選右邊那個檔。進入比對畫面,訊息列說「比對完成:共 7 個差異區塊」。
原始檔案不會馬上被碰到

進入比對時,爾雅會先把兩個檔案各複製一份到暫存目錄,之後所有的差異互抄都寫在暫存副本上。原始檔案要等你明確確認才會被覆蓋(見 3.4.7)。所以放心抄來抄去,反悔了直接 Esc 放棄就好。

兩種檔案進不了比對
  • 大型檔案(64 MiB 以上):「大型檔案唯讀模式暫不支援雙欄比對,以避免載入完整內容造成記憶體耗盡」。
  • 二進位檔案:「二進位檔案不支援雙欄比對」。

選到這兩種時會在選檔階段就被擋下來,不會進到比對畫面。

3.4.2

畫面怎麼看

左右各一半,中間一條直線;每一側都有自己的行號欄。

爾雅 Erya │ 檔案比對
左 │ nginx.conf │ 右 │ nginx.conf.new
1 worker_processes 4; │ 1 worker_processes 4; 2 │ 2 3≠ keepalive_timeout 65; │ 3≠ keepalive_timeout 75; 4 gzip on; │ 4 gzip on; 5 ▶ client_max_body_size 8m;│ 5 ▶ client_max_body_size 8m; 6- access_log off; │ 7 server { │ 6 server { │ │ 7+ listen 8443 ssl;
游標第 5/9 列 目前差異 2/7 水平欄 1 │ 圖例:亮列/▶ 游標 ≠ 修改 - 僅左側 + 僅右側
N 下一個差異 P 上一個差異 Shift+→ 游標處左→右 Shift+← 游標處右→左 Ctrl+S 套用 Esc 返回
畫面元素說明
第二列(提示列)換成左右兩個檔名,各佔畫面一半,中間的分隔線跟底下的內容對齊。
行號欄每側四位數行號,後面接兩個標記欄:差異種類與游標。
空白列某一側沒有對應內容時該側留空——這就是「對齊」的效果,讓相同的行排在同一列上。
狀態列游標在第幾列/共幾列、目前是第幾個差異/共幾個、水平捲到第幾欄,後面接圖例。
訊息列常駐顯示比對專用的操作說明。做了動作之後會換成該動作的回報。
3.4.3

三種差異標記

不必只靠顏色判讀——每一種差異都有自己的符號。

符號意思畫面上長怎樣
≠兩側都有,但內容不同兩側都標,而且行內不一樣的那幾個字會用更強的顏色再標一次
-只有左側有左側標記,右側該列留空
+只有右側有右側標記,左側該列留空
(空白)兩側相同沒有標記

另外兩個標記跟差異無關,是位置指示:

  • ▶ 是游標,左右兩側同時出現在同一列——兩邊的游標是綁在一起的。
  • 整列變亮代表游標所在的列。
  • 行號變成黃底代表這是「目前這個差異區塊」,也就是 N/P 停下來的地方。
連續的差異行算一個「區塊」

狀態列說「目前差異 2/7」的 7,數的是區塊不是行。連著改的五行算一個區塊,N 一次就跳過整塊,抄的時候也是整塊一起抄。

3.4.4

游標與差異是兩件事

這是比對畫面最容易搞混的一點。

游標(▶)

用 ↑ ↓、PageUp PageDown、Home End 移動,一次一列,相同的行也會停。

複製差異看的是游標在哪一列。

目前差異(黃底行號)

用 N/P 跳,一次一個區塊,只停在有差異的地方。

跳過去的時候游標也會跟著移動,所以跳完就可以直接抄。

游標停在相同的行上就抄不動

按了 Shift+→ 卻沒反應、訊息列說「游標所在位置沒有可複製的差異區塊」,就是這個原因。先按 N 跳到差異上,再抄。

3.4.5

移動與捲動

兩側永遠同步,不會各捲各的。

按鍵做什麼
↑ ↓游標上下一列,畫面跟著跑
PageUp PageDown整頁移動
Home End到比對結果的最前面/最後面
← →兩側同步水平捲動,看行很長的內容時用
Ctrl+← Ctrl+→水平一次捲 8 欄
N下一個差異區塊
P上一個差異區塊

N/P 走到最後一個差異之後會繞回第一個,所以連按下去可以繞著整份文件檢查。

3.4.6

把差異抄到另一邊

兩個鍵,方向就是箭頭的方向。

按鍵做什麼
Shift+→把游標所在的差異區塊從左邊抄到右邊(寫進右側暫存檔)
Shift+←把游標所在的差異區塊從右邊抄到左邊
  • 抄完訊息列說「已將目前差異從左側複製到右側暫存檔;剩餘 6 個差異區塊」——剩幾個是直接告訴你的。
  • 抄完之後游標與畫面位置不動,讓你確認結果對不對。要去下一個差異請自己按 N。
  • 整個區塊一起抄,不是一行一行抄。
  • 寫暫存檔失敗時(磁碟滿、權限問題)會說「更新暫存檔失敗:…」。
標準的合併流程

N 跳到差異 → 看一眼 → 要抄就 Shift+→ 或 Shift+←,不抄就再按 N → 一路走到繞回第一個 → 最後按 Ctrl+S 套用。全程只用四個鍵。

3.4.7

套用回原始檔案

按目前配置的儲存鍵(預設 Ctrl+S),然後回答 Y 或 N。

確定以暫存比對結果覆蓋原始檔案?Y 覆蓋/N 取消
  1. 按 Ctrl+S。沒有任何暫存變更時會直接說「目前沒有需要套用的暫存變更」,不會問你。
  2. 按 Y 確認。爾雅會先檢查原始檔案有沒有被外部程式改過,沒問題才覆蓋。
  3. 成功。訊息列說「已確認並覆蓋 2 個原始檔案」——只有真的改過的那一側會被寫入。
  4. 失敗。說「未覆蓋原始檔案:…」,兩邊都不會被改。最常見的原因就是原檔在比對期間被別人動過。
  5. 按 N 取消。「已取消覆蓋,暫存變更仍保留」——你抄的東西還在,可以繼續改或稍後再套用。
覆蓋前的外部檢查是硬性的

這跟一般編輯的存檔保護是同一套機制(見 2.1.7)。比對通常要花一點時間,中間原檔被 git checkout 換掉是很常見的事,爾雅不會默默把它蓋回去。

3.4.8

離開時的三個選擇

還有沒套用的暫存變更時,Esc 會先問。

暫存變更尚未套用:Y 覆蓋並離開/N 放棄並離開/Esc 返回
按鍵結果
Y覆蓋原始檔案然後離開(一樣會先檢查外部修改)。
N放棄暫存變更並離開。你抄的東西全部不算數,原始檔案維持原樣。
Esc回到比對畫面,什麼都不做。

沒有任何暫存變更時,Esc 直接離開,不會問。

離開之後暫存副本就清掉了

暫存目錄只在比對期間存在。按 N 放棄離開之後,抄過的內容沒辦法救回來——重新比對一次就是了,反正原檔還在。

3.4.9

常見錯誤

雙欄比對的七個常見狀況。

現象原因與處理
Shift+→ 沒反應游標停在相同的行上。先按 N 跳到差異(3.4.4)。
選檔時就被擋下來選到大型檔案或二進位檔(3.4.1)。
抄完了但原檔沒變改的是暫存副本。要按 Ctrl+S 再按 Y 才會寫回去(3.4.7)。
套用時說未覆蓋原始檔案原檔在比對期間被外部改過。離開後重新比對一次(3.4.7)。
離開後發現抄的東西不見了離開時按了 N(放棄並離開)(3.4.8)。
看不到行的後半段用 ← → 水平捲動,兩側會同步(3.4.5)。
差異數量跟預期不一樣數的是區塊不是行;連續的差異行算一個(3.4.3)。