Skip to content

支持的格式 ​

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源码 + 渲染净化后的内联渲染
Web.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 会直接内联显示——就像访达中的快速查看。有两种预览方式:

  • 打开它(在文件浏览器中点击、使用 文件 → 打开文件...,或拖入窗口),在标签页中查看。
  • 快速查看:在文件浏览器中选中文件后按 空格键,即可打开全窗口预览浮层。按 空格键、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 提供完整的工具栏、段落格式化、中日韩规则、数学公式、Mermaid、脚注——所有现有 Markdown 功能。
  • 数据格式(JSON、YAML、TOML)在源码窗格中显示解析错误的行号标记;树形预览随输入实时更新。仅适用于 Markdown 的菜单操作已禁用(中日韩格式化、插入块、段落格式化);与当前模式相关的控件保持可用。右键上下文菜单精简为剪贴板操作(剪切/复制/粘贴/全选)。
  • 可视化格式(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++。单个波浪号表示下标,绝不表示删除线。

嵌套上限。 所见即所得模式支持最多 1000 层嵌套的引用块和列表。嵌套更深的文档会以源码模式打开,并附带一条说明其嵌套深度的消息,状态栏显示 “已以源码模式打开(无法在 WYSIWYG 模式下显示)。” 处于该状态时,文件受到保护,不会被富文本编辑器覆盖。减少嵌套后,使用 切换到富文本模式。围栏代码块、分隔线和行内强调不计入该上限。另请参阅大文件。

VMark 如何判断文件类型 ​

VMark 将 Markdown 视为允许列表,而不是默认值。规则依次为:

  1. Markdown 系列扩展名(.md、.markdown、.mdown、.mkd、.mdx)在富文本 Markdown 编辑器中打开。
  2. 已注册的非 Markdown 扩展名(在其类别已启用时——JSON、YAML、代码查看器等)在该格式的源码窗格中打开。
  3. 其他所有文件——.env、.env.local、Dockerfile、Makefile、.gitignore、未知扩展名——在纯文本源码窗格中打开,绝不会进入 Markdown 编辑器。

这意味着配置文件永远不会被悄悄地按 Markdown 渲染。.env.local 会以纯文本打开,其中的 KEY=value 行、# 注释和下划线都会原样保留。

点文件(dotfile)系列会被视为一组:对 .env 设置的覆盖同样适用于 .env.local、.env.production 等。

从系统中打开文件 ​

安装程序会在操作系统中将 VMark 注册为以下文件类型的编辑器,因此它们会出现在 打开方式 中,并可通过双击在 VMark 中打开:

扩展名注册类型
.md、.markdown、.mdown、.mkd、.mdxMarkdown 文档
.txt纯文本文档
.json、.jsonlJSON 文档
.yaml、.ymlYAML 文档
.tomlTOML 文档
.mmdMermaid 图表
.svgSVG 图像
.html、.htmHTML 文档

在 Windows 上,安装程序不会接管已由其他程序处理的文件类型:对于每个已有默认程序的扩展名,VMark 只会把自己加入 打开方式,并保留原有默认程序。只有在没有任何程序注册的情况下它才会成为默认程序——实际上就是 Markdown 扩展名,而不包括 .txt、.html、.htm 或 .svg。你自己在 Windows 设置中选择的默认程序始终优先。卸载时会恢复 Windows 的 新建 → 文本文档 菜单项以及之前的处理程序。

已注册的文件只有在其格式已启用时才会在 VMark 中打开(参见启用格式);否则会以纯文本打开。

在 Windows 和 Linux 上,通过命令行传入的文件夹(vmark C:\notes 或 vmark ~/notes)会在单独的窗口中作为工作区打开,就像在 macOS 上把文件夹拖到程序坞图标上一样。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 预览依赖三个独立的防御层:

  1. <iframe sandbox="">,空允许列表——无脚本、无同源、无表单、无弹窗。沙盒通过 iframe 属性本身强制执行(根据 MDN,<meta> 中的 CSP 不等同于沙盒)。
  2. DOMPurify 净化先于其他步骤运行——剥离 <script>、javascript: URL、内联事件处理器和 base-href 技巧。
  3. CSP <meta> 注入——default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:; base-uri 'none';——限制 iframe 内部的资源加载。

验证器会将脚本标签、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 属性都无法让内联脚本运行。

在外部编辑器中打开 ​

对于代码文件,只读横幅上的 在外部编辑器中打开 按钮会启动你选择的编辑器。解析顺序:

  1. 设置 → 格式 → 外部编辑器(图形界面字段——参见设置)。可以填写已知编辑器的名称(code、cursor、zed、subl、bbedit、idea、vim、nvim、emacs、notepad++ 等),也可以填写编辑器的完整路径——macOS 上的 .app 应用包,Linux/Windows 上的可执行文件。该字段只容纳一个程序,从不包含参数;如需传递参数,请使用 $VMARK_EXTERNAL_EDITOR。
  2. $VMARK_EXTERNAL_EDITOR(项目级环境变量覆盖)
  3. $VISUAL
  4. $EDITOR
  5. 平台默认(macOS 上的 open -t、Windows 上的 notepad.exe、Linux 上的 xdg-open)

图形界面设置优先于环境变量——显式优于隐式。留空则使用环境变量回退链。

VMark 通过登录 Shell 的 PATH 进行路由,因此从 macOS 图形界面应用启动时,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 命令还会拒绝以下情况:

  • 不存在的路径
  • 目录和其他非普通文件(套接字、设备)
  • 规范化扩展名不在 VMark 已注册格式集中的路径
  • 其规范化目标未通过上述任何检查的符号链接

即使 webview 遭到入侵,也无法通过此按钮在任意系统文件(密码、密钥等)上启动外部编辑器——只能对 VMark 本身可打开的路径操作。

暂不支持的内容 ​

根据计划的非目标:

  • 不是代码编辑器。 无 LSP、无自动补全、无重构、无调试器、无 git 边距标记。
  • 不是"所有纯文本格式"。 范围有限——参见上方表格。
  • 默认不执行 HTML 脚本。 仅提供沙盒渲染,除非你通过受信任的 HTML 预览明确授权某个文件。
  • v1 版本不支持非 Markdown 格式的打印 / 导出 / 复制为 HTML。
  • 代码查看器暂不支持:Zig、Swift、Kotlin、Java、Elixir、OCaml 以及 12 个扩展名以外的其他语言。决策原则是"我们自己使用的语言"——如需添加,欢迎提交 issue。

如果你需要的格式未列出,且不在明确的非支持范围内,欢迎提交 issue。