支援的格式
VMark 可以直接開啟以下所有檔案格式。其差異化之處在於結構感知預覽:當檔案為已知產物時,VMark 會渲染正確的視圖,而非通用的 JSON 樹狀結構。
啟用格式
Markdown、純文字和 YAML/YML 一律在完整編輯器中開啟——這是沉穩的預設值。以下所有其他格式預設為關閉,需在設定 → 格式中切換對應分類才能啟用:
| 切換項目 | 啟用 |
|---|---|
| 資料格式 | .json、.jsonl、.toml(分割面板:原始碼 + 樹狀結構,含 Cargo / package.json / pyproject 結構渲染器) |
| 圖表與 SVG | .mmd、.svg(分割面板:原始碼 + 淨化後的即時渲染) |
| HTML 預覽 | .html、.htm(沙盒 iframe——請見HTML 安全模型) |
| 程式碼檢視器 | 12 個唯讀程式碼檢視器(.ts、.tsx、.js、.jsx、.py、.rs、.go、.css、.sh、.bash、.rb、.lua) |
當某個分類關閉時,對應的副檔名會退回至純文字模式,檔案仍可開啟,只是不會顯示預覽或結構視圖。切換後,格式登錄檔會即時重建;已開啟的分頁會以正確的轉接器重新掛載。
升級至多格式支援後首次啟動時,VMark 會顯示一次性的提示通知,引導你前往設定 → 格式。若你已關閉通知(或全新安裝),隨時可在設定 → 格式找到該面板。
快速一覽
| 類型 | 副檔名 | 預設 | 編輯器 | 預覽 |
|---|---|---|---|---|
| Markdown | .md、.markdown、.mdown、.mkd、.mdx | 一律開啟 | 所見即所得 + 原始碼模式 | 渲染後的內文 |
| 純文字 | .txt | 一律開啟 | 原始碼 | — |
| 資料——YAML | .yaml、.yml | 一律開啟 | 原始碼 + 樹狀結構 | 可導覽的樹狀結構,結構感知(GitHub Actions、VMark 工作流程) |
| 資料——JSON | .json、.jsonl | 需啟用資料格式 | 原始碼 + 樹狀結構 | 可導覽的 JSON 樹狀結構,結構感知(package.json) |
| 資料——TOML | .toml | 需啟用資料格式 | 原始碼 + 樹狀結構 | 可導覽的樹狀結構,結構感知(Cargo.toml、pyproject.toml) |
| 圖表 | .mmd | 需啟用圖表與 SVG | 原始碼 + 渲染 | 即時 Mermaid 圖表 |
| 向量圖形 | .svg | 需啟用圖表與 SVG | 原始碼 + 渲染 | 淨化後的行內渲染 |
| 網頁 | .html、.htm | 需啟用HTML 預覽 | 原始碼 + 渲染 | 沙盒 iframe(空的 sandbox=""、DOMPurify、CSP);受信任模式需針對個別檔案選擇啟用 |
| 程式碼(唯讀) | .ts、.tsx、.js、.jsx、.py、.rs、.go、.css、.sh、.bash、.rb、.lua | 需啟用程式碼檢視器 | 檢視器(可切換為編輯) | — |
| 媒體 | 圖片(.png、.jpg、.gif、.webp、.heic、.tiff…)、影片(.mp4、.webm、.mov…)、音訊(.mp3、.wav、.flac…) | 一律開啟 | 檢視器(唯讀) | 原生圖片 / <video> / <audio> |
程式碼檔案預設為唯讀,並顯示橫幅提供啟用編輯或在外部編輯器中開啟的選項。
檢視模式(原始碼 / 分割 / 預覽)
任何具有預覽的格式——HTML、SVG、Mermaid、JSON、YAML、TOML——開啟時右上角都會有一個小型的原始碼 · 分割 · 預覽切換鈕:
- 原始碼——可編輯的原始碼面板,佔滿整個寬度。
- 分割——原始碼與預覽並排顯示(預設)。
- 預覽——渲染結果,佔滿整個寬度。預覽是唯讀的渲染;若要編輯,請切換回原始碼或分割。
你也可以用鍵盤切換:F6 在原始碼 ⇄ 分割之間切換,Shift + F6 在預覽 ⇄ 分割之間切換(分割是基礎狀態)。你的選擇會依分頁記住。新開啟檔案的預設值可在設定 → 格式 → 預設檢視模式中設定。
沒有預覽的格式(純文字、程式碼檢視器)一律只顯示原始碼,因此不會出現切換鈕。
媒體檔案(圖片、影片、音訊)
開啟圖片、影片或音訊檔案時,VMark 會直接在行內顯示——就像 Finder 中的快速查看(Quick Look)。有兩種預覽方式:
- 開啟它(在檔案總管中點擊、使用檔案 → 開啟檔案...,或拖曳進來),在分頁中檢視。
- 快速查看:在檔案總管中選取檔案並按下 Space,即可顯示全視窗的預覽覆蓋層。按下 Space、Esc 或點擊背景即可關閉。
運作方式與預期行為:
- 絕不以文字載入。 媒體是二進位檔案——VMark 透過原生資源管線將檔案直接串流至檢視器。它絕不會以 UTF-8 讀取、絕不會以文件形式保留在記憶體中,也絕不可編輯或儲存。即使是數 GB 的影片也能立即開啟,並以原生方式跳轉播放位置。
- 磁碟上的修改會自動反映。 從你的編輯器重新匯出圖片,或讓指令稿改寫它,已開啟的分頁會自行載入新版本——無需重新開啟,也無需關閉後再開啟檔案。
- 廣泛的格式支援。 VMark 將檔案交由平台的媒體引擎處理,因此支援範圍取決於你系統的 webview 能解碼哪些格式。在 macOS 上支援範圍很廣——HEIC、TIFF、
.mov/H.264 和 FLAC 都能播放。webview 無法解碼的格式(例如.mkv、.avi、.wmv)仍可開啟,並顯示一個備用面板,提供以預設應用程式開啟和在 Finder 中顯示(Windows 上為在檔案總管中顯示,Linux 上為在檔案管理員中顯示)。 - 唯讀。 媒體分頁永遠不會變成未儲存狀態,關閉時也不會出現儲存提示。
結構感知預覽
當路徑或內容符合已知結構時,VMark 會以正確的視圖取代通用樹狀結構。
GitHub Actions 工作流程(.github/workflows/*.yml)
以工作流程工作台開啟:互動式的工作 DAG 畫布,加上帶有儲存 / 捨棄功能的結構化表單編輯器(請見工作流程檢視器指南)。原始碼面板同樣具備工作流程感知能力——$ 運算式自動完成、游標至畫布的工作醒目提示,以及在本機 uses: 參照上 Cmd-點擊跳轉。
- 路徑偵測:
.github/workflows/下的.yml/.yaml檔案會路由至工作流程渲染器——即使 YAML 格式有誤,你也會看到帶有診斷資訊的降級視圖,而非空白樹狀結構。(檔案須先通過 YAML 轉接器;這需要.yml/.yaml副檔名。) - 內容偵測:頂層的
on:和jobs:鍵。
VMark 工作流程(頂層 steps:)
以工作流程執行面板開啟:帶有狀態列的執行 / 取消工具列、即時步驟圖(或解析錯誤),以及在寫入過檔案的執行之後出現的還原檔案。請見工作流程指南。
- 路徑偵測:絕不位於
.github/workflows/之下——該資料夾屬於 GitHub。 - 內容偵測:YAML 可成功解析、沒有頂層
jobs:,且有一個頂層steps:清單,其中至少一個步驟的uses:以genie/、action/或webhook/開頭。格式錯誤的 YAML 絕不會被視為 VMark 工作流程。 - 此面板需要啟用設定 → 進階 → 工作流程引擎。引擎關閉時,檔案會顯示一般的 YAML 樹狀結構(除非從此分頁啟動的執行仍在進行中,這樣它的取消按鈕才能維持可用)。
Cargo.toml
以 Rust 相依性樹狀結構開啟——執行期、開發和建置相依性,含版本規格與功能旗標。
- 路徑偵測:POSIX 或 Windows 路徑上的檔名
Cargo.toml(不分大小寫)。 - 內容偵測:
[package]或[workspace]標頭。 - 不進行網路呼叫——VMark 不會解析 crates.io。
package.json
以 npm 相依性樹狀結構開啟——dependencies、devDependencies、peerDependencies、optionalDependencies。
- 路徑偵測:檔名
package.json。 - 內容偵測:頂層的
name加上dependencies/devDependencies/peerDependencies其中之一。
pyproject.toml
以 Python 相依性樹狀結構開啟——同時支援 PEP 621([project] + [project.optional-dependencies])和 Poetry([tool.poetry.dependencies]、[tool.poetry.dev-dependencies]、[tool.poetry.group.<name>.dependencies])。
- 路徑偵測:檔名
pyproject.toml。 - 內容偵測:
[project]或[tool.poetry]標頭(以乾淨的 TOML 解析為前提)。
編輯規則
- Markdown 提供完整工具列、段落格式設定、CJK 規則、數學、Mermaid、腳注——所有現有 Markdown 功能。
- 資料格式(JSON、YAML、TOML)在原始碼面板中顯示,帶有解析錯誤的側邊欄標記;樹狀預覽會隨輸入即時更新。僅適用於 Markdown 的選單操作已停用(CJK 格式化、插入區塊、段落格式設定);與模式相關的控制項仍保持啟用。右鍵內容選單精簡為剪貼簿操作(剪下 / 複製 / 貼上 / 全選)。
- 視覺格式(Mermaid、SVG、HTML)在原始碼面板中顯示,右側面板顯示渲染視圖。預覽的渲染優先順序低於你的輸入,因此在大型文件上,它會在游標之後稍慢一拍跟上,而不是每次按鍵都重新渲染。
- 程式碼格式以語法高亮的檢視器開啟;可切換為就地編輯,或在外部編輯器中開啟(見下方說明)。
Markdown 語法方言
VMark 使用 remark(底層為 micromark)讀寫 Markdown:支援 CommonMark,加上 GitHub Flavored Markdown(表格、任務清單、以 ~~ 表示的刪除線、自動連結、腳注)、YAML front matter、$…$ / $$…$$ 數學式、Wiki 連結([[target]])、GitHub 提示區塊(> [!NOTE]、[!TIP]、[!IMPORTANT]、[!WARNING]、[!CAUTION])、<details> 區塊、[TOC],以及四種行內標記:==highlight==、~subscript~、^superscript^ 和 ++underline++。單一波浪號代表下標,絕不代表刪除線。
巢狀層數上限。 WYSIWYG 支援最多 1000 層巢狀的引用區塊與清單。超過此深度的文件會以原始碼模式開啟,並顯示一則說明其巢狀深度的訊息,狀態列則顯示*「已以原始碼模式開啟(無法在 WYSIWYG 模式下顯示)。」*處於此狀態時,檔案會受到保護,不會被豐富編輯器覆寫。請先減少巢狀層數,再使用切換為所見即所得。圍欄程式碼區塊、分隔線和行內強調不計入此上限。另請參閱大型檔案。
VMark 如何決定檔案類型
VMark 將 Markdown 視為允許清單,而非預設值。規則依序如下:
- Markdown 系列副檔名(
.md、.markdown、.mdown、.mkd、.mdx)會在豐富的 Markdown 編輯器中開啟。 - 已登錄的非 Markdown 副檔名(其分類已啟用時——JSON、YAML、程式碼檢視器等)會在該格式的原始碼面板中開啟。
- 其他所有檔案——
.env、.env.local、Dockerfile、Makefile、.gitignore、未知副檔名——都會在純文字原始碼面板中開啟,絕不會進入 Markdown 編輯器。
這表示設定檔絕不會被悄悄當成 Markdown 渲染。.env.local 會以純文字開啟,其中的 KEY=value 行、# 註解和底線都會完全保持原樣。
點檔案(dotfile)系列會被視為一組:對 .env 的覆寫也涵蓋 .env.local、.env.production 等。
從系統開啟檔案
安裝程式會在作業系統中將 VMark 登錄為下列檔案類型的編輯器,因此它們會出現在打開方式中,並可透過雙擊在 VMark 中開啟:
| 副檔名 | 登錄類型 |
|---|---|
.md、.markdown、.mdown、.mkd、.mdx | Markdown 文件 |
.txt | 純文字文件 |
.json、.jsonl | JSON 文件 |
.yaml、.yml | YAML 文件 |
.toml | TOML 文件 |
.mmd | Mermaid 圖表 |
.svg | SVG 圖片 |
.html、.htm | HTML 文件 |
在 Windows 上,安裝程式不會接管已有其他程式處理的檔案類型:對於每個已有預設程式的副檔名,VMark 會將自己加入開啟檔案清單,並保留原本的預設程式。只有在尚未登錄任何程式的副檔名上,VMark 才會成為預設程式——實際上就是 Markdown 副檔名,而非 .txt、.html、.htm 或 .svg。你自己在 Windows 設定中選擇的預設程式永遠優先。解除安裝時會還原 Windows 的新增 → 文字文件選單項目以及先前的處理程式。
已登錄的檔案只有在其格式已啟用時才會在 VMark 中開啟(請見啟用格式);否則會以純文字開啟。
在 Windows 與 Linux 上,透過命令列傳入的資料夾(vmark C:\notes 或 vmark ~/notes)會在獨立的視窗中以工作區開啟,就像在 macOS 上把資料夾拖到 Dock 圖示上一樣。VMark 已在執行時也同樣適用。
純文字檔案的語法高亮
即使檔案以純文字開啟,VMark 在辨識出類型時仍會為其上色——.env/.ini/.conf(properties)、.sh/.bash(shell)、Dockerfile、.toml、.sql、.diff,以及常見的程式語言。這純粹是外觀上的處理;它絕不會改變檔案開啟時所用的編輯器,而且無論程式碼檢視器分類是否啟用都能運作。
覆寫:「設定檔案類型」
偵測結果只是預設值,而非束縛。開啟命令面板並執行:
- 設定檔案類型:純文字——強制目前的檔案系列以純文字開啟(例如避免你當作原始筆記保存的
.txt被渲染)。 - 設定檔案類型:Markdown——以 Markdown 編輯器渲染非
.md檔案(例如你實際以 Markdown 撰寫的.txt)。 - 設定檔案類型:恢復預設——移除覆寫。
覆寫會依檔案系列記住(依副檔名,或對 .env 這類檔案依點檔案主檔名),並跨工作階段保留。它們的優先順序高於上述內建規則。
尋找、儲存、內容搜尋
- 檔案 → 開啟檔案... 提供兩個過濾器:所有支援的格式(所有已登錄格式)與 Markdown。此項目沒有預設快捷鍵——
Mod + O是快速開啟——但你可以在 設定 → 快捷鍵 中為它指定一個。另存新檔的過濾器和預設儲存副檔名,均源自當前分頁的格式轉接器,因此儲存.toml檔案時會建議以.toml作為副檔名。 - 拖放接受任何已登錄的副檔名。
- 另存新檔的過濾器和預設副檔名源自當前分頁的格式轉接器。
- Cmd+Shift+H 內容搜尋(「在檔案中尋找」)會索引所有類文字格式(Markdown、txt、json、yaml、toml、html、svg、mermaid)。程式碼檔案預設不納入索引——它們處於程式碼檢視器模式。
HTML 安全模型
根據多格式計畫的 ADR-4,HTML 預覽建立在三個獨立的防禦層之上:
<iframe sandbox="">使用空的允許清單——無腳本、無同源、無表單、無彈出視窗。沙盒僅由 iframe 屬性本身強制執行(根據 MDN,透過<meta>設定的 CSP 並非沙盒)。- DOMPurify 淨化優先執行——剝除
<script>、javascript:URL、行內事件處理器、base-href 技巧。 - CSP
<meta>注入——default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:; base-uri 'none';——限制 iframe 內的資源載入。
驗證器會將 script 標籤、javascript: URL 和行內事件處理器標示為警告,讓你了解哪些內容被封鎖。一旦你信任該檔案,它們會改以資訊形式顯示,因此不會與受信任橫幅相互矛盾。有兩則訊息說明預覽無論是否受信任都絕不允許的行為:外部腳本(<script src="…">)絕不會被載入,因為沒有任何腳本來自檔案或 URL;而指向其他視窗或頂層頁面(target="_top"、_blank 或 <base target>)的 javascript: 連結絕不會導覽,因為預覽無法離開自身。偵測只是約略讀取頁面的標籤;它只負責標示發現的問題,絕不決定什麼內容會執行——那是沙盒的職責。
此預覽的正式安全審核簽署仍在進行中,預覽會在渲染頁面上方以提示說明這一點:**HTML 預覽已沙箱化。其安全審查仍在進行中。**上述三層防護皆已到位,尚待完成的一步是在執行中的應用程式 WebView 內,針對 OWASP XSS 攻擊載荷確認它們。
受信任的 HTML 預覽(選擇性啟用)
上述的安全預覽是預設值,且永遠不會改變。對於你自己撰寫的文件——互動式實驗、本機儀表板、獨立的示範頁面——你可以授權該單一檔案、在本次工作階段中執行腳本。
使用預覽上方列中的啟用受信任預覽…。你會先看到一則警告;在你確認之前,什麼都不會執行。啟用期間,該列會持續顯示並標示受信任——指令碼已啟用,只需點擊一下即可撤銷信任。
受信任模式授予什麼、不授予什麼:
| 受信任預覽 | |
|---|---|
JavaScript、DOM、指標事件、requestAnimationFrame、Web Audio | ✅ 可執行 |
網路(fetch、XMLHttpRequest、WebSocket、遠端圖片 / 腳本) | ❌ 被 default-src 'none' 封鎖 |
| VMark 自身的頁面、Tauri 指令、你的檔案系統 | ❌ 無法觸及——文件在屬於它自己的不透明來源(opaque origin)中執行 |
| 頂層導覽、彈出視窗、表單提交、下載、強制回應對話框 | ❌ 未授予(僅有 sandbox="allow-scripts",別無其他) |
| 相機、麥克風、地理位置、剪貼簿 | ❌ 沒有任何功能委派給該框架 |
localStorage / sessionStorage | ❌ 無法使用——不透明來源沒有同源儲存空間 |
eval / new Function | ❌ 不允許 |
值得了解的三個特性:
- 信任絕不會被推斷。 不會根據
.html副檔名、不會根據檔案的來源,也不會根據你已信任的同層檔案推斷。只有確認動作才會授予信任。 - 信任絕不會被保存。 關閉 VMark 後,所有授權都會消失。未儲存的文件也無法使用此功能,因為它沒有可供附加授權的身分——請先儲存檔案。
- 受信任預覽絕不會自行重新執行。 編輯原始碼會將它標示為可能與目前的原始碼不一致並等待你按下重新載入,因此正在執行的模擬不會因每次按鍵而重設。當 VMark 無法得知框架正在執行什麼時,也會出現相同的標示——在你切換到其他分頁再切回來,或關閉後重新開啟之後,預覽會繼續執行該檔案最後一次發布的內容,所以它會如實說明,而不是聲稱自己是最新的。重新載入會依檔案目前的狀態重新發布。
Windows 透過本機 http 來源提供
WebView2 不支援自訂 URL 協定,因此在 Windows 上,受信任的文件會從 http://vmark-trusted.localhost 而非 vmark-trusted:// 提供——同樣的授權、同樣的沙盒、同樣的 CSP,只是改用 Tauri 在該平台上為所有自訂協定使用的 URL 形式。安全預覽在所有平台上都能運作。
受信任的內容從 vmark-trusted:// 來源(Windows 上為 http://vmark-trusted.localhost)提供,並帶有其專屬的嚴格 CSP。這層間接處理是必要的,而非裝飾:srcdoc、blob: 或 data: 框架會繼承 VMark 自身的 script-src 'self' 政策,而框架內的 CSP 只能收緊繼承而來的政策,永遠無法放寬——因此單靠任何 iframe 屬性都無法讓行內腳本執行。
在外部編輯器中開啟
對於程式碼檔案,唯讀橫幅上的在外部編輯器中開啟按鈕會啟動你選擇的編輯器。解析優先順序如下:
- 設定 → 格式 → 外部編輯器(圖形介面欄位——請見設定)。輸入已知編輯器的名稱(
code、cursor、zed、subl、bbedit、idea、vim、nvim、emacs、notepad++…),或編輯器的完整路徑——在 macOS 上為.app套件,在 Linux/Windows 上為可執行檔。此欄位只能填寫一個程式,絕不包含參數;若要傳遞參數,請使用$VMARK_EXTERNAL_EDITOR。 $VMARK_EXTERNAL_EDITOR(專案層級的環境變數覆蓋)$VISUAL$EDITOR- 平台預設(macOS 上的
open -t、Windows 上的notepad.exe、Linux 上的xdg-open)
圖形介面設定優先於環境變數——明確勝於隱含。將欄位留空可使用環境變數備用鏈。
VMark 透過登入 shell 的 PATH 進行路由,因此從 macOS GUI 應用程式啟動時,VS Code / Cursor / JetBrains 包裝器也能正確解析。
安全閘道
在啟動任何程式之前,外部編輯器設定本身會先經過檢查。VMark 會拒絕:
- shell 字元(
;、|、&、`、$、<、>、引號、換行)以及開頭的- - 不是 VMark 已知編輯器的單純名稱——「VMark 無法依名稱辨識編輯器「X」,請改為填寫該編輯器的完整路徑」
- 相對路徑、含有
..片段或結尾斜線的路徑,或不存在的路徑 - 會執行傳入檔案而非開啟它們的程式——shell(
sh、bash、zsh、pwsh、cmd…)、直譯器(python、node、ruby、perl、osascript…)、啟動器(env、sudo、open、xdg-open…)或終端機模擬器——會同時以你輸入的名稱和連結解析後的名稱進行檢查
備用鏈中的環境變數不受限制:它們是由你在 VMark 之外設定的。
open_in_external_editor Tauri 指令還會拒絕下列情況:
- 不存在的路徑
- 目錄及其他非一般檔案(socket、裝置)
- 標準化副檔名不在 VMark 已登錄格式集中的路徑
- 標準化目標不通過上述任何檢查的符號連結
被入侵的 webview 無法透過此按鈕對任意系統檔案(密碼、金鑰等)啟動外部編輯器——只能對 VMark 本身也可開啟的路徑使用。
不支援的功能
根據計畫的非目標:
- 不是程式碼編輯器。 無 LSP、無自動完成、無重構、無除錯器、無 git 差異檢視。
- 不是「所有純文字格式」。 範圍有限——請見上方表格。
- 預設不執行 HTML 腳本。 僅提供沙盒渲染,除非你透過受信任的 HTML 預覽明確授權某個檔案。
- v1 不支援非 Markdown 格式的列印 / 匯出 / 複製為 HTML。
- 尚未作為程式碼檢視器支援:Zig、Swift、Kotlin、Java、Elixir、OCaml 及 12 個副檔名集之外的其他語言。決策原則是「我們自己使用的語言」——若你希望加入某種語言,請提交 Issue。
若你想要的格式未列出,且並非刻意排除在範圍之外,歡迎提交 Issue。