一个文本文件,后缀是 .mull,里面塞着互相链接的页面——这就是 Mull 对 wiki 的全部定义。它没有数据库,没有目录树,没有后台服务。你在 Visual Studio Code 或 Cursor 里打开它,语法高亮、悬停预览、补全、诊断、格式化、重构全都到位。
![]()
听起来像是个玩具,但它把语言服务器的能力搬进了一个纯文本文件里。这件事值得拆开看看。
![]()
每个页面以 # 标题 开头,后面跟内容。想链接到另一个页面,就用方括号,比如 [Lemons]。当你敲下左方括号的那一刻,自动补全就会跳出来帮你找目标页面。
![]()
规则只有一条:每个 wiki 都从 Home 页开始,其他所有页面都必须能从 Home 出发、沿着链接直接或间接抵达。这条约束替代了层级结构——页面同时扮演了传统意义上文件和目录的角色。
保存文件时,Mull 会自动格式化。它根据页面之间的链接关系决定页面在文件里的排列顺序,你不需要操心这件事。链接是组织页面的唯一手段。
文件也能链。照片、表格、任何东西都行。Mull 会检查被链接的文件是否真实存在,并且不用离开编辑器就能预览。这些文件放在 wiki 旁边一个同名目录里,后缀从 .mull 换成 _files。比如 my_wiki.mull 对应 my_wiki_files。链接 [/photos/beach.jpg] 就能指向 my_wiki_files/photos/beach.jpg,目录本身也能链,写成 [/photos/]。
和页面必须从 Home 可达一样,_files 里的每个文件也必须被 wiki 链接到。链接一个目录,等于隐式链接了里面所有内容。空目录则需要单独给它一个链接。
真正有意思的是 portal。它是一个页面在另一个页面里的窗口,持有目标页面内容的副本,Mull 负责保持同步。写法是 ::: [Pancakes] :::,格式化时这一行会被展开成 Pancakes 页面的完整内容。你编辑原页面或任何一个 portal,改动都会传播到其余副本。
排序也能自动化。假设你有一份想保持有序的清单,建一个 _files/scripts/sort.sh,内容就是 sort "$@",加上可执行权限。然后把清单放进 ::: sort 块里,Mull 会在每次格式化时自动排序。脚本接受参数,所以 ::: sort -r 就是倒序。
在块里使用脚本,本身就算作对它的链接,不需要额外再链一次。但没被用到的脚本仍然需要在 wiki 某处有个链接。
转义规则和 Markdown 类似:想字面使用方括号就加反斜杠,反引号表示逐字文本,围栏代码块也支持,常见语言有语法高亮。页面标题和代码内部不需要转义。
命令行也能跑,适合放进 CI:mull check --path wiki.mull。子命令包括 check、format、page、language-server。二进制干所有活,IDE 扩展只是调用它。
macOS 或 Linux(AArch64 或 x86-64)用一行命令安装,会先装二进制再装扩展,重复执行即可更新。支持 VERSION 和 PREFIX 两个环境变量,后者默认 /usr/local/bin。改了安装路径,可能还要同步调整编辑器里的 mull.executablePath。
Windows 用户从最新 release 下载二进制,重命名为 mull,放进 %PROGRAMFILES%\Mull,再把该目录加进系统 PATH。有 Cargo 的话,cargo install mull 也行,加 --force 更新。
扩展的安装方式是下载 mull.vsix,在扩展视图的菜单里选「Install from VSIX...」。用 macOS / Linux 安装脚本的话,扩展会自动装好,这一步可以跳过。
把 wiki 的组织逻辑压缩成一条可达性规则,把格式化交给链接关系,把扩展能力交给语言服务器——Mull 的取舍很干净。它不试图成为 Notion,也不打算替代 Obsidian。它只是赌一件事:一个文件,加上一条规则,够用了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.