大型檔案
VMark 開啟大多數 Markdown 檔案都能瞬間完成,但極大型檔案需要額外處理才能維持流暢的反應。本頁說明 VMark 是如何處理這類檔案,以及你可以怎麼調整相關行為。
什麼算「大型」
VMark 會在開啟前先依大小分級,Markdown 檔案還會同時參考估算的區塊數:
| 大小或區塊數 | 級別 | 行為 |
|---|---|---|
| < 1 MB 且估算少於 1,200 個區塊 | 小檔 | 立即在所見即所得(WYSIWYG)模式中開啟。 |
| 1 MB – 5 MB,或估算 1,200 個區塊以上 | 大檔 | 預設以 原始碼模式 開啟,通常於一秒內完成。狀態列會提供「切換到 WYSIWYG」連結。 |
| 5 MB – 50 MB | 巨型 | 先彈出確認對話方塊。僅能以原始碼模式開啟。 |
| ≥ 50 MB | 拒絕 | VMark 拒絕開啟此檔案。請改用 less、bat 等工具檢視。 |
檔案大小是透過作業系統取得,不會讀取檔案內容。對於小於 1 MB 的 Markdown 檔案,VMark 接著會逐列掃描檔案位元組來估算區塊數 —— 這不是 Markdown 解析 —— 因此判斷依然迅速,也絕不會把文件載入 WebView。
為何大型檔案改用原始碼模式
原始碼模式以 CodeMirror 為基礎,採用視窗虛擬化(viewport virtualization)—— 只渲染目前可見的部分。WYSIWYG 模式使用 Tiptap/ProseMirror,必須為文件中的每個區塊都建立對應的 DOM 節點。對一個 1.4 MB、約 2,250 個區塊的 Markdown 檔案而言,首次開啟大約需要 15 秒;而原始碼模式開啟同一檔案卻不到一秒。
決定檢視建構成本的是區塊數量,而不是檔案大小。三份大小幾乎相同(377–397 KB)、只是位元組切分成區塊的密度不同的測試檔案,在 601、1,201、3,401 個區塊時分別花 3.6、5.2、18 秒開啟。一份由 3,773 個短區塊組成的 524 KB 文件在那台機器上耗時超過 30 秒 —— 低於 1 MB 的位元組門檻,卻遠超過視窗停止回應的臨界點。因此,區塊數估算本身就能把檔案導向原始碼模式。
大部分時間花在建構與排版視圖,而不是解析。在一台較慢的機器上實測一份較長的中日韓文件,解析占編輯器開啟成本的四分之一到五分之二。
開啟文件的過程中
VMark 會先讓視窗能回應選單、快捷鍵與關閉按鈕,再建構文件的富文字視圖,文件隨後出現。過去會先建構長文件,在較慢的機器上,這可能讓視窗遲遲無法就緒:選單反應遲緩,記錄檔中顯示 menu commands did not mount within 5000ms。
WYSIWYG 在開啟時所做的工作也與文件規模相稱:
- 圖片在接近可見區域時才載入。
- 中日韓文字元間距(設定 → 編輯器 → 字型設計)在關閉時(預設)不做任何工作,開啟時只掃描文件一次。
- 程式碼高亮、中日韓間距、lint 標記等裝飾的成本與文件長度大致呈線性關係。過去超長文件的成本是平方級的。
狀態列提示
- 以 WYSIWYG 開啟大型檔案時: 狀態列左側會顯示一個不確定進度的轉圈動畫,搭配文字 「正在開啟大型檔案(N MB)…」,直到編輯器準備就緒才消失。
- 大型檔案被自動以原始碼模式開啟時: 狀態列會出現 「已以原始碼模式開啟(大型檔案)。」,並附上 切換到 WYSIWYG 連結。點擊連結會將目前分頁切換到 WYSIWYG。關閉再重新開啟此檔案會回到原始碼模式 —— 這個覆寫只在當下這個工作階段內有效。
- WYSIWYG 無法顯示的文件: 引言或清單巢狀超過 1000 層的文件,無論檔案大小,都無法解析為格式文字。它會以原始碼模式開啟,並跳出提示說明巢狀深度;狀態列會出現 「已以原始碼模式開啟(無法在 WYSIWYG 模式下顯示)。」。減少巢狀層級後,再點擊 切換到 WYSIWYG。
設定
打開 設定 → 編輯器 → 大型檔案:
- 將大型檔案自動以原始碼模式開啟 (預設開啟) —— 涵蓋超過 1 MB 的檔案以及區塊密度高的 Markdown。如果你寧可在最大 5 MB 的檔案上接受較長的開啟時間以使用 WYSIWYG,可以關閉這個選項。
- 開啟超過 5 MB 的檔案前提醒我 (預設開啟) —— 關閉後,5 MB 至 50 MB 之間的檔案不再彈出確認對話方塊,但仍會以原始碼模式開啟。
50 MB 的硬性拒絕門檻不開放使用者調整。Webview 無法安全地承載任意大的字串,否則有耗盡記憶體並崩潰的風險。
小技巧
- 如果你必須在 WYSIWYG 中持續編輯一個非常大的檔案,可以考慮把它拆成多個較小的檔案,並透過一份索引文件互相連結。Markdown 對「分章節寫作」的友善程度其實相當高。
- 如果你只是想閱讀或搜尋大型檔案,在原始碼模式下搭配行號標尺與
Find(Mod + F)通常是最快的方式。 - 格式 → 中日韓 → 格式化整個檔案 等整份文件層級的指令,在原始碼模式的文件上仍可正常執行。
邊界情況
- 檔案在開啟期間變大。 VMark 是依開啟當下的大小決定級別。即使檔案在你編輯時膨脹到 2 MB,它仍會留在你選定的模式裡。
- 符號連結。 大小是以實際指向的檔案為準,因此一個指向 10 MB 檔案的符號連結會被視為巨型檔案。
- 空檔案。 零位元組的檔案視為小檔,以 WYSIWYG 開啟。
- 檔案在大小檢查與讀取之間消失。 會出現一般的「找不到檔案」錯誤 —— 不會額外發出警告。
已知限制
- 區塊數只是估算,不是解析:以空行分隔的內文、標題、清單項目、表格列,以及每個圍欄程式碼區塊都算一個區塊;圍欄內的程式碼與 frontmatter 列不計入。結構特殊的文件可能會在 WYSIWYG 本來就足夠快時被導向原始碼模式;切換到 WYSIWYG 只需點一下。非 Markdown 檔案從不依區塊數分級。
- 所見即所得模式在開啟時仍會建構文件的每一個區塊 —— 只有圖片和行內公式會等到接近可見區域時才載入或渲染 —— 因此將大型檔案切換到所見即所得時,需要付出上文所述的完整開啟時間。