這次介紹一個新的桌面寫作工具:Vex(維刻)。
Vex 是基於 .NET 10 + Avalonia 12 構建的免費開源跨平台 Markdown 編輯器。它不做大而全的知識庫,也不復刻成熟商業編輯器,當前主線很清楚:Markdown 原始碼編輯、即時預覽、檔案管理、匯出,以及複製到內容平台。
專案倉庫:https://github.com/dotnet9/Vex
Release v1.0.0:https://github.com/dotnet9/Vex/releases/tag/v1.0.0
Vex 的 Slogan 是:極簡之力,妙筆成章。
先看編輯體驗。下面這段 GIF 用 Vex 開啟本文副本,左側繼續寫 Markdown,右側即時預覽;標題、引用、列表、程式碼區塊和狀態列統計都會跟著變化。

寫完以後,Vex 可以把 Markdown 複製成適合微信公眾號編輯器貼上的 HTML。下面是從檔案選單選擇「複製到公眾號」,再貼到公眾號圖文編輯器的過程。瀏覽器網址列做了遮擋處理。

不是 Typora
Vex 確實參考過 Typora 的簡潔選單、專注寫作和 Markdown 檔案優先,但它不是 Typora 復刻版。
Typora 的所見即所得編輯體驗非常成熟,而把 Markdown 原始碼和最終排版無縫合在同一個編輯面裡,本質上要處理游標映射、選取、復原重做、輸入法、表格、圖片、程式碼區塊和跨平台文字行為。Vex 當前不走這條路線。
更現實的目標是:做一個免費開源的 .NET + Avalonia 跨平台 Markdown 桌面編輯器,把「寫、看、查、匯出、複製到發布平台」這條鏈路先做順。
v1.0.0
v1.0.0 發布於 2026 年 5 月 24 日,是 Vex 的首個穩定版本。這個版本已經涵蓋日常寫作的基本閉環:
- Markdown 原始碼編輯、即時預覽、大綱導航、文件統計。
- 智慧型列表續寫、原始碼模式、編輯區當前行高亮。
- 新增、開啟、儲存、另存新檔、開啟資料夾、最近文件、拖曳開啟、啟動參數開啟。
- 檔案重新命名、刪除、開啟所在位置、外部變更偵測與重新載入。
- 尋找取代、大小寫/整詞/正則匹配、命中計數和大文件防抖掃描。
- HTML、PNG、影像型 PDF、列印預覽、複製 HTML 和複製到內容平台。
- 本地圖片、SVG 柵格化、任務列表、排版主題化匯出、PDF 頁首頁尾。
- 多主題、多排版主題、緊湊佈局、暗色模式細節最佳化。
- 簡體中文、繁體中文、英語、日語四套 UI 和說明文件。
- 多 RID 發布、壓縮包、SHA256、release manifest,以及可選 Windows MSIX 打包。
當前主介面如下:左側是檔案列表和大綱,中央是 Markdown 原始碼編輯區,右側是 Avalonia 原生渲染的預覽區,底部狀態列顯示儲存狀態、編碼、縮放、行列號、詞數和字元數。

寫作與預覽
Vex 的工作區是三欄結構:
- 左側:檔案列表與大綱導航。
- 中間:基於 AvaloniaEdit 的 Markdown 編輯區。
- 右側:基於 CodeWF.Markdown 的預覽區。
它沒有把 Markdown 預覽交給 WebView,而是沿用 CodeWF.Markdown 的 Avalonia 控制項渲染路線。主題、字型、圖片、表格、程式碼區塊、任務列表、SVG 和匯出鏈路都留在桌面控制項體系裡處理。
長文件最需要的是大綱。Vex 會從標題結構裡提取導航入口,切到「大綱」後可以直接跳轉到對應段落。

只想專注原始碼時,可以從檢視選單切換「原始碼模式」。它會暫時收起側欄和預覽區,退出時恢復原本的佈局。

檢視選單還補了「重新整理預覽」,快捷鍵是 F5。它會強制重新整理預覽繫結,並給遠端圖片 URL 加版本查詢參數,適合封面或遠端配圖剛更新但預覽仍命中舊快取的情況。

檔案與發布
檔案選單放的是寫作工具最常用的動作:新增、開啟、開啟資料夾、快速開啟、最近文件、按編碼重開、複製到內容平台、儲存、另存新檔、屬性、匯出、列印和關閉。

動態看更直觀。檔案選單現在會按內容完整展開,不再需要在選單裡二次捲動;開啟、儲存、最近檔案、編碼重開、複製到內容平台、匯出 HTML/PNG/PDF、列印都在同一條工作流程裡。

幾個細節比較實用:
- 開啟資料夾後,左側文件列表可以在目前目錄的 Markdown 檔案之間切換。
- 最近文件減少重複定位檔案的成本。
- 重新按編碼開啟保留 UTF-8、UTF-8 BOM、GB18030、Big5 等入口。
- 複製到公眾號、知乎、稀土掘金把「發布到哪裡」也放進編輯流程。
- 匯出選單支援 HTML、PNG 和 PDF;Word 入口已預留,後續穩定後再補。
對公眾號作者來說,真正高頻的不是「儲存一個 HTML 檔案」,而是寫完後直接貼到微信公眾號編輯器,並盡量保留標題、段落、引用、列表、程式碼區塊和連結樣式。Vex 當前就是沿著這條路徑最佳化。
尋找取代
長文件不能只靠眼睛掃。Vex 的尋找欄支援尋找、取代、下一個、取代、全部取代、關閉,以及大小寫、整詞和正則匹配。

下面繼續用本文示範:搜尋 Markdown,再開啟取代欄準備取代成更具體的詞。尋找欄會顯示目前命中位置和總命中數。

大文件掃描做了防抖處理,取代路徑也盡量使用 AvaloniaEdit 文件級 Replace,避免每次取代都重建整篇文字。
主題、排版和語言
外觀入口放在說明選單下,目前包含主題色、排版主題、緊湊佈局和語言設定。

主題色控制應用程式外殼,排版主題控制 Markdown 正文。兩者分開後,可以組合出不同工作環境:淺色外殼配簡潔排版,或暗色外殼配更適合程式碼閱讀的排版主題。

多語言目前涵蓋:
- 簡體中文
- 繁體中文
- English
- 日本語
這部分由 Lang.Avalonia.Json、Semi.Avalonia、Ursa.Avalonia 以及 Vex 自己的說明文件共同組成。選單、狀態列、錯誤詳情、快速開始、更新日誌、致謝和關於視窗都在本地化範圍內。
新手引導
Vex 也是 CodeWF.AvaloniaControls 新增 Guide 引導控制項的落地專案。首次啟動時顯示一次,之後可從說明選單重新開啟。
引導涵蓋檔案選單、匯出選單、段落/格式/檢視選單、主題選單、左側檔案/大綱區域、編輯區、預覽區和狀態列。

最有價值的是選單項引導。很多桌面軟體入口藏在選單或二級選單裡,一般遮罩控制項只能高亮頁面上已經存在的按鈕;Vex 會在步驟切換時主動展開選單,再定位裡面的 MenuItem。

左側「檔案/大綱」是 TabControl,引導到不同頁籤時需要先切換頁籤,再重新整理高亮位置。

關於視窗展示軟體名稱、中文名、版本、編譯時間、作者、網站和品牌資訊。

技術棧
Vex 目前主要技術棧:
- .NET 10
- Avalonia 12.0.3
- Prism.DryIoc.Avalonia
- ReactiveUI.Avalonia
- Semi.Avalonia
- Ursa.Avalonia
- AvaloniaEdit
- CodeWF.AvaloniaControls
- CodeWF.Markdown
- CodeWF.EventBus
- Lang.Avalonia.Json
目標架構是 net10.0 和 net10.0-windows,執行階段識別碼涵蓋:
win-x64linux-x64linux-arm64osx-x64osx-arm64
Windows 發布路徑啟用 Native AOT,並將最低 Windows 支援平台版本設到 6.1;非 Windows RID 走 self-contained single-file 發布。publish_vex_all.bat --package 會產生壓縮包、SHA256 檔案和 release manifest。
Release 裡還有一個相容性調整:事件匯流排統一直接使用 CodeWF.EventBus.EventBus.Default,避開 DryIoc 事件匯流排註冊路徑,改善 Windows 7 啟動相容性。
建置與發布
本機開發:
dotnet build Vex.slnx
產生多平台發布產物:
.\publish_vex_all.bat --package
準備 Windows MSIX 佈局或安裝包:
.\scripts\package_vex_msix.ps1 -RuntimeIdentifier win-x64 -PrepareOnly
後續方向
Vex 後續不會優先挑戰所見即所得即時編輯,而是繼續圍繞「編輯預覽 + 發布複製」補基礎能力:
- 繼續最佳化複製到微信公眾號的 HTML 結構和樣式相容性。
- 補齊知乎、稀土掘金等平台的複製樣式。
- 增加公眾號行動端預覽效果。
- 改進本地圖片、相對路徑和複製時的資源提示。
- 最佳化大綱跳轉、編輯區和預覽區捲動聯動。
- 增加更多排版主題,並允許儲存自訂發布樣式。
- 完善 Word 匯出、自動更新和安裝包發布流程。
- 繼續打磨 Linux、macOS 下的字型、選單、快捷鍵和打包體驗。
小結
Vex 1.0.0 的重點不是複雜知識庫,而是把 Markdown 桌面寫作工具的基本體驗打通:開啟檔案、寫內容、看預覽、按大綱跳轉、尋找取代、換主題、匯出交付。
資料夾切換、最近文件、外部變更重新載入、編碼選擇、複製到內容平台、多語言說明、首次啟動引導、狀態列統計,這些單獨看都不大,但組合起來會直接影響它能不能進入日常寫作流程。
相關地址:
- Vex 倉庫:https://github.com/dotnet9/Vex
- Release v1.0.0:https://github.com/dotnet9/Vex/releases/tag/v1.0.0