打开方式
每个文件,用最合适的方式打开。
udctl 用最合适的查看器显示每个文件——图片用图片查看器,图表用图表编辑器。你可以随时切换查看器、设置自己的默认项,或用插件教会 udctl 一种全新的文件类型。

合适的查看器
合适的视图,随你更改。
一键切换查看器
大多数时候 udctl 会根据文件名自动选好查看器。当一个文件可以用多种方式显示时,文件上方的 打开方式 按钮会显示当前使用的查看器,并让你切换到另一个——此外还随时提供“以文本查看”和“下载”。当同一类文件有不止一个插件能打开时,它们都会各自作为一个选项出现在菜单里。
设置跟随你的默认项
想让某种文件总是用同样方式打开?选择“始终以此方式打开 .xyz 文件”。默认项绑定到你的账号,会跨设备跟随你,也不会影响任何其他人。
文档:切换与默认项 →
内置
覆盖你最常用的文件类型。
图表
.drawio 通用图表与 udctl 数据流图
Excalidraw
手绘风格草图
图片、视频与音频
内嵌预览媒体文件
PDF 与 Word
文档就地打开
电子表格与表格
行列直接渲染
Markdown、代码与文本
内置语法高亮
演示文稿与 HTML
幻灯片与网页
其他类型? 任何没有内置查看器的文件类型都无法自行预览——udctl 不会给你一个空白预览,而是告诉你还没有能打开它的应用,并在下载链接旁边把你指向插件库,让你为它添加一个查看器。
你自己的查看器
教会 udctl 一种新文件类型。
一个插件就是一个自包含的 .html 文件——就像安装一个 app 让操作系统能打开一种新文件。udctl 把要显示的文件交给插件,插件负责绘制。一个完整可用的插件就这么简单:
<!doctype html> <html> <body> <pre id="out">Waiting for a file…</pre> <script> // 1. Listen for the file udctl will send. window.addEventListener('message', function (event) { var msg = event.data; if (!msg || msg.udPlugin !== 1 || msg.type !== 'file') return; var text = new TextDecoder().decode(msg.bytes); document.getElementById('out').textContent = msg.fileName + '\n\n' + text; }); // 2. Tell udctl we are ready to receive it. parent.postMessage({ udPlugin: 1, type: 'ready' }, '*'); </script> </body> </html>
沙箱隔离,且只属于你
udctl 在一个封闭沙箱里运行每个插件:它只能读取并显示你打开的那一个文件,无法访问网络、看不到你的其他文件、也碰不到你的账号。安装前你会看到插件能做什么并需要确认——所以规则很简单:只装你信任的插件。你安装的插件只属于你自己。

插件库
浏览、一键安装、分享你自己的。

从插件库一键安装
打开 设置 → 资源插件 → 插件库,浏览发布到官方 registry 的插件,一键安装。udctl 会用 registry 中的指纹校验每个插件,确保你装到的就是发布的那一份。
一个现成的例子
官方的 Jupyter Notebook Viewer 可以渲染 .ipynb 笔记本——markdown 与代码单元、语法高亮、表格和图片。从插件库安装它,几秒钟就能试用插件。
文档:registry 如何运作 →提交你自己的
发布一个插件给所有人。
Fork registry 仓库
Fork 公开仓库 oatnil-top/ud-registry.
加入你的文件和条目
把你构建好的 .html 放到 plugins/<id>/<id>.html 并在 plugins.json 中加入对应条目。
提交 pull request
自动检查会校验指纹,审阅者会阅读源码,合并后即发布到插件库。
目前在哪里可用
“打开方式”以及本页的全部内容,现已在网页版上线:app.udctl.com。桌面端将在下个版本加入——在那之前,请在网页版使用这些功能。
打开一切,按你的方式。
在网页版试用各种查看器,阅读完整指南,或浏览插件 registry。