spinss

MDeX v2.2.1(macOS · Windows · Linux · Tauri v2)

MDeX · 读作 “em-dex”(/ˌemˈdɛks/)—— 字母 M 接 “dex”,共两个音节。

一款主打隐私与 AI 辅助的多语言 Markdown 阅读编辑器。所有文件均在本地处理,默认不联网、不上传、无云端同步、无广告、无遥测;采用原子化保存,无惧崩溃或断电导致的数据丢失。自 v2.0 起提供可选的 AI 辅助编辑——并且仍可保持完全离线:接入本地模型(如 Ollama)时完全不联网;只有在线 AI 服务(OpenAI / DeepSeek / Anthropic / GLM / Gemini / Kimi 等)才会发起请求,且仅在你配置并主动触发时。


🌐 语言

界面提供 17 种语言:简体中文、English、Français、Deutsch、Español、Português、Italiano、Русский、日本語、한국어、العربية、हिन्दी、ਪੰਜਾਬੀ、Tiếng Việt、Bahasa Indonesia、اردو、Монгол (Кирилл)。


✨ 核心功能


⌨️ 快捷键

macOS 用 ,Windows / Linux 用 Ctrl

快捷键 功能
⌘/Ctrl + N 新建
⌘/Ctrl + O 打开文件
⌘/Ctrl + S 保存
⌘/Ctrl + Shift + S 另存为
⌘/Ctrl + W 关闭标签页
⌘/Ctrl + Shift + W 关闭窗口
⌘/Ctrl + F 查找
⌘/Ctrl + H 替换
⌘/Ctrl + B / I / E 加粗 / 斜体 / 行内代码
⌘/Ctrl + K 插入链接
Tab 缩进 2 空格
Alt/Option + 拖拽 矩形(列)选取
Alt/Option + Shift + ←↑↓→ 扩展列选取
Esc 取消列选取
⌘/Ctrl + =/−/0 放大 / 缩小 / 重置(作用最后点击的窗格:编辑区或预览区)
⌘/Ctrl + J AI 辅助编辑

多窗口下,快捷键只作用于当前焦点窗口。图查看器窗口打开时,⌘/Ctrl + =/−/0 缩放图片。


📝 语法速查

Markdown:标题 # / ## / ###、加粗 **文本**、斜体 *文本*、删除线 ~~文本~~、行内代码 `代码`、代码块(三反引号围起,可标语言)、引用 > 文本、列表 - / 1.、任务列表 - [ ] / - [x]、链接 [文字](URL)、图片 ![描述](URL)、分割线 ---、表格 | A | B |

数学公式:行内 $E = mc^2$;块级 $$\int_0^1 x\,dx$$(可跨行)。使用 LaTeX 语法,由 KaTeX 渲染;代码块内的 $ 不会被当作公式分隔符。支持 align / aligned、矩阵、分段函数 cases 等环境。

文献引用:正文写 [@key][@a; @b](LaTeX 兼容 \cite{key}),在文档中用 ```bibtex 块内嵌文献库,或用「文献」按钮加载 .bib。文末自动生成参考文献表,正文 [n] 可点击跳转。


📤 导出(另存为)

点击「另存为」后选择格式:


🔒 离线与安全


📦 安装

下载预编译包

从任一来源下载对应平台的安装包:

macOS (.dmg, universal arm64 + x86_64), Windows (.exe, NSIS installer), Linux (.deb / .rpm / .AppImage).

macOS 打开未签名程序(绕过 Gatekeeper)

本程序未做开发者签名 / 公证(离线场景通常无法联网公证)。在 macOS 12+,尤其是 macOS 26(Tahoe) 上,从 .dmg 直接运行、或刚复制出来的副本会报 "MDeX.app is damaged and can't be opened"(已损坏,无法打开)——这是 Gatekeeper 拦截,并非真的损坏。在终端执行:

  1. 先把 MDeX.app.dmg 拖到 /Applications(应用程序)——切勿直接在 dmg 里双击运行(会触发 App Translocation 与 com.apple.provenance 属性,这才是 macOS 26 上「已损坏」的真因)。
  2. 清除属性并重新签名:
    xattr -cr /Applications/MDeX.app
    codesign --force --deep --sign - /Applications/MDeX.app

    com.apple.provenance 受 SIP 保护,即使 sudo 也删不掉;重新签名会重置签名链,使 Gatekeeper 放行。spctl 对 ad-hoc 签名会显示 rejected——属正常,不影响 open 启动。

  3. open /Applications/MDeX.app 启动(或双击)。首次打开可能仍提示一次——到「系统设置 → 隐私与安全性 → 仍要打开」确认,或右键 .app →「打开」。

🛠️ 从源码构建

源代码: https://github.com/fwzheng/mdex. 一次性准备:npm installnpm run fetch(下载 vendor,带完整性锁)→ npm run build:html(把 vendor + src/app.js 内联进 dist/index.html)→ cargo tauri dev / cargo tauri build。测试:npm test(前端)· npx tsc --noEmit(类型)· cd src-tauri && cargo test --lib(后端)。


📁 目录结构

markdown/
├── app-shell.html          # 前端外壳(HTML+CSS);应用逻辑在 src/app.js(+ i18n.js / help.js 数据)
├── src/
│   ├── app.js              # 应用逻辑(// @ts-check;由 build-html.mjs 内联进 dist)
│   ├── i18n.js            # 17-language UI strings (pure data; window.I18N, split from app.js)
│   ├── help.js            # help-document data (HELP_STRINGS + SK/sc/CITE_HELP_*, window.HELP_DATA)
│   └── globals.d.ts        # vendor / Window 类型声明(供类型检查)
├── tsconfig.json           # 类型检查配置(tsc --noEmit;无打包器)
├── tools/
│   ├── fetch-vendor.mjs    # 一次性下载依赖到 vendor/ + 完整性锁(仅准备阶段联网)
│   ├── build-html.mjs      # 把 vendor + src/app.js + i18n.js + help.js 内联进 dist/index.html(KaTeX 字体→base64)
│   └── test-pure.mjs       # 前端纯函数测试(npm test)
├── dist/index.html         # 构建产物:自包含的单文件(Tauri 的 frontendDist)
├── vendor/                 # 下载缓存 + integrity.json(.gitignore)
├── package.json            # @tauri-apps/cli + typescript(dev) + 脚本
└── src-tauri/
    ├── Cargo.toml          # tauri 2 + dialog / single-instance + encoding_rs
    ├── build.rs            # tauri_build::build()
    ├── tauri.conf.json     # 窗口 1200×750、严格 CSP、图标、.md 关联、菜单钩子
    ├── capabilities/default.json
    ├── icons/              # cargo tauri icon 生成的全套图标
    └── src/{main.rs, lib.rs}   # 菜单 + 文件读写 + 多窗口路由 + 原子写 / 文件所有权

🎨 自定义

想改 位置
应用名 / Bundle ID src-tauri/tauri.conf.jsonproductName / identifier
窗口尺寸 tauri.conf.jsonapp.windows[0](默认 1200×750)
图标 替换源图后 npm run icon
主题色 / 字体 app-shell.html 顶部 :root CSS 变量
菜单项 src-tauri/src/lib.rsbuild_menu()
界面文案 / 帮助文档 src/i18n.jsI18N / src/help.jsHELP_STRINGS
依赖版本 tools/fetch-vendor.mjs 顶部 VERSIONS(改完 npm run fetch -- --force
测试 / 类型检查 npm test(前端)· tsc --noEmit(类型)· cargo test --lib(后端)

📄 许可证

本项目自身代码遵循 Apache License 2.0 协议开源。

第三方组件:项目使用了部分第三方组件(包括但不限于 marked、KaTeX、highlight.js、DOMPurify、jsPDF、html2canvas-pro、turndown、mermaid、@retorquere/bibtex-parser 及 Tauri 等),其版权与许可证声明详见各源码文件。上述组件分别遵循 MIT、BSD-3-Clause、Apache-2.0 及 MPL-2.0 等开源协议。

分发要求:依据 Apache-2.0 协议规定,对本项目进行再分发时,须保留 LICENSE 与 NOTICE 文件;若修改过源文件,须在相应文件中作出明确标注。


📬 联系

问题与建议欢迎联系:郑法伟 (Fawei Zheng) fwzheng@bit.edu.cn