第三部・進階功能 / 3.1

編碼、換行與語法

爾雅是為中文文件寫的,所以編碼這件事被放在很前面:開檔自動偵測、狀態列一直顯示、按 F7 換編碼、按 F8 換換行格式,而且轉不過去時會拒絕,不會用問號把你的字吃掉。

閱讀時間 約 14 分鐘 對象 會碰到舊檔案的人 先備知識 2.1 版本 v1.0 ・ 2026-08-26
3.1.1

開檔時的編碼偵測

爾雅會自己猜,猜完把結果寫在狀態列上。

讀進位元組 開頭有 UTF-8 BOM → UTF-8 BOM 整份是合法 UTF-8 → UTF-8 交給偵測器猜 → Big5/GBK/Shift_JIS 猜不到或有 NUL → 報錯,或改走位元組檢視 偵測到什麼,狀態列就寫什麼 報告.txt │ 5:24 │ 插入 │ Big5 │ CRLF 不改它的話,存檔就會照原本的編碼寫回去
圖 3.1.1 偵測順序。UTF-8 是先看有沒有 BOM、再看整份能不能當 UTF-8 解;都不行才交給偵測器在 Big5、GBK、Shift_JIS 之間猜。
  • 爾雅認得五種編碼:UTF-8、UTF-8 BOM、Big5、GBK、Shift_JIS。
  • 開檔不會改變檔案。偵測出來的編碼只是「下次存檔要用哪一種」的預設值。
  • 偵測是靠內容統計猜的,短檔案有可能猜錯(例如只有幾個中文字的 Big5 檔被當成 GBK)。看到亂碼就直接按 F7 換一個試(見 3.1.2)。
  • UTF-16/UTF-32 這類寬字元編碼不在支援範圍,開啟時會直接回報「detected unsupported text encoding: UTF-16LE」之類的訊息,不會硬解成亂碼,也不會偽裝成二進位檔讓你去改位元組。
3.1.2

F7 切換儲存編碼

按一次換一種,循環五個選項。

UTF-8 UTF-8 BOM Big5 GBK Shift_JIS 再按一次回到 UTF-8
圖 3.1.2 F7 的循環順序。狀態列最後第二格會跟著換,訊息列說「已切換為 Big5;儲存後完成編碼轉換」。
按 F7 不會馬上改檔案

它改的是「下一次儲存要用哪一種編碼」。真正的轉換發生在 Ctrl+S 的時候。所以按完 F7 之後:想轉就存檔,不想轉就再按幾次轉回去,或直接 Ctrl+Z 復原——編碼切換也算一步,可以復原與重做。

最常見的用法就是把舊的 Big5 文件轉成 UTF-8:開檔(狀態列顯示 Big5)→ 按 F7 到 UTF-8 → Ctrl+S。反過來要交給只吃 Big5 的老系統也是同一招。

3.1.3

轉不過去的時候

爾雅會跳過那個編碼,不會用問號把你的字換掉。

Big5 沒有「𠮟」、Shift_JIS 沒有「愛心 Emoji」——這種情況下很多工具會默默寫入 ? 或 □,等你發現已經來不及。爾雅的做法不一樣:

  1. 先試著轉。整份文件都能用目標編碼表示才算成功。
  2. 有字表示不了就跳過這個編碼,自動試下一個。所以按一次 F7 有可能直接從 UTF-8 跳到 GBK——因為中間的 Big5 表示不了文件裡的某個字。
  3. 五種都試過都不行,才顯示「無法切換為 …:文件含有此編碼無法表示的字元」,並且維持原本的編碼不變。
寧可不轉,也不破壞內容

這是爾雅在編碼上最重要的一條原則。存檔之後的檔案,要嘛完整、要嘛就是原本的編碼,不會出現一半正常一半問號的檔案。找不出是哪個字轉不過去時,先轉成 UTF-8 存一份,再用其他工具比對。

3.1.4

F8 切換 LF/CRLF

跟編碼一樣,是「下次存檔」才生效。

顯示是什麼常見於
LF換行 \nLinux、macOS、大部分程式語言與設定檔
CRLF回車+換行 \r\nWindows 的文字檔、部分老系統匯出的資料
  • 爾雅開檔時會看出來原本是哪一種,狀態列最後一格顯示。
  • F8 在兩者之間切換,訊息列說「已切換為 CRLF;儲存後完成換行格式轉換」。
  • 一樣可以 Ctrl+Z 復原。
  • 檔案結尾有沒有換行也會被保留:原本沒有結尾換行的檔案,存回去也不會被硬加一個。
Git 一直說整個檔案都改了?

那通常就是換行格式被換掉了。用爾雅開檔看狀態列最後一格,按 F8 轉回原本那一種再存,diff 就乾淨了。

3.1.5

語法高亮怎麼決定

看完整檔名,再看副檔名;認得出來就上色,認不出來就純文字。

  • 認得的語言會顯示在狀態列的第四格(例如 Markdown、TOML)。沒有那一格就是沒有高亮。
  • 常見程式語言都有:Rust、C/C++、Go、Python、Java、JavaScript/TypeScript、Shell、SQL、Markdown 等。
  • 結構化格式:TOML、YAML、JSON、XML、.ini、.conf。
  • 選取的灰底會蓋在高亮顏色上面,兩者不會互相干擾。
遇到超長行會自動節制

單行超過 64 KiB,或游標一次跳過大量行時,爾雅會改用有界的高亮策略,避免語法解析把畫面卡住。這時候可能會看到某些行暫時沒有上色——內容沒事,只是沒替它上色。另外大型檔案唯讀模式完全停用語法高亮(見 3.2.2)。

3.1.6

Linux 設定檔也有高亮

很多設定檔沒有副檔名,爾雅是認完整檔名的。

類別認得的檔名或副檔名
通用設定.conf、.ini、.editorconfig
systemd unit.service、.socket、.timer、.mount、.target、.network
環境變數.env、.env.*
結構化格式TOML、YAML、JSON、XML
Shell 啟動檔.bashrc、.profile、.zshrc、/etc/default/*
系統設定.gitconfig、sshd_config、ssh_config、sudoers、fstab、hosts、resolv.conf
服務設定nginx.conf、Apache 設定、crontab、Dockerfile/Containerfile、Makefile

這一份清單是刻意列進必要支援範圍的——爾雅預期的使用情境之一,就是SSH 進伺服器改設定檔。

3.1.7

Ctrl+T 格式化文件

只做三種格式:TOML、YAML、JSON。

訊息列意思
已格式化文件;Ctrl+Z 可復原成功。整批算一步復原(見 2.4.2)。
文件格式已是最新狀態本來就整齊,什麼都沒改。
目前僅支援格式化 TOML、YAML 與 JSON 文件這個檔案不是那三種。爾雅看的是副檔名。
格式化失敗,文件未變更:…語法有錯。錯誤訊息通常會指出哪一行,文件維持原樣。
TOML 與 YAML 的註解會被保留

很多格式化工具會把註解吃掉,爾雅不會。這一點對設定檔特別重要——註解常常是唯一寫著「為什麼要這樣設」的地方。

拿它當語法檢查用

改完一個 .yaml 之後按一下 Ctrl+T:沒事就代表語法是對的,有錯它會直接告訴你錯在哪。比部署上去才發現快得多。

3.1.8

段落重排與段落寬度

把一段長文字重新斷行到指定寬度。預設沒有綁按鍵。

動作名稱Classic 的鍵做什麼
set_paragraph_widthAlt+M設定重排寬度,範圍 20–500 欄,預設 80。
reflow_paragraphAlt+Q把游標所在的段落依設定寬度重新編排。
  • 「段落」的界線是空行:從游標往上下找到最近的空行為止。
  • 游標停在空行上按重排,會說「目前游標不在段落內」。
  • 成功時說「已依 80 欄重新編排段落」。整段算一步復原。
  • 寬度輸入超出 20–500 會說「段落寬度必須是 20 到 500 的整數」。
  • 重排會依終端欄寬計算,中文全形字算兩欄,所以排出來的右邊界是真的對齊的。
這兩個動作預設是空的

跟常用語、巨集一樣(見 2.4.8)。要用就換 Erya Classic,或在按鍵配置編輯器裡自己綁(見 4.1.4)。

重排(改內容)跟自動換行(只改顯示)不一樣

Ctrl+L 的自動換行只影響畫面,檔案內容一個字都不會動;段落重排是真的在文件裡插入換行。要交出去的純文字稿用重排,自己閱讀長行用自動換行。

3.1.9

常見錯誤

編碼與格式最容易踩到的六件事。

現象原因與處理
開起來整份是亂碼偵測猜錯了。按 F7 換一種看看,對了再存(3.1.2)。
按了 F7 檔案沒變要存檔才會真的轉(3.1.2)。
按 F7 跳過了某一種編碼那一種表示不了文件裡的某個字,被自動跳過了(3.1.3)。
Git diff 顯示整個檔案都改了換行格式被換掉。F8 轉回去(3.1.4)。
設定檔沒有語法高亮檔名不在認得的清單裡(3.1.6),或它是大型檔案(3.2.2)。
Ctrl+T 說不支援只做 TOML/YAML/JSON 三種(3.1.7)。