# mgx **Repository Path**: bigant/mgx ## Basic Information - **Project Name**: mgx - **Description**: Windows 下快速的markdown memo - **Primary Language**: Rust - **License**: AGPL-3.0 - **Default Branch**: mgx-2 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-07 - **Last Updated**: 2026-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MGX - Markdown General Editor 一个简洁、优雅的 Windows 桌面 Markdown 笔记应用,常驻系统托盘,支持实时预览、云端同步和丰富的编辑功能。 **当前版本:v3.1.6** ## 主要特性 ### 编辑器 - **CodeMirror 6** 编辑器,流畅的编辑体验 - **双预览模式**(状态栏一键切换,默认 ILP): - **Inline Live Preview(ILP)**:markdown 在编辑器内就地渲染——标题、列表、引用、代码块、表格、图片、公式、Mermaid、JSON、calc、任务列表、目录等 12 类块级渲染 + 行内格式实时呈现;点击渲染块精确落点并退化为源码编辑,光标移出恢复渲染;右侧浮动 **TOC 目录面板**(默认收缩为小按钮,点击展开,支持点击条目跳转 + 滚动自动高亮) - **分屏预览**:编辑器与预览并排显示,平滑滚动同步 - **工具栏**:加粗、斜体、标题(H1-H6)、链接、图片、表格、代码块、列表、Emoji 等 - **格式 toggle**:选中已格式化内容时自动移除标记;多行列表互相转换 - **快捷键**: - `Ctrl+B` — 加粗 / `Ctrl+I` — 斜体 - `Ctrl+K` — 插入链接 / `Ctrl+`` ` — 行内代码 - `Ctrl+S` — 手动保存 - `Ctrl+P` — 打印(ILP 模式重新渲染整文档;分屏模式克隆预览 DOM) ### Markdown 功能 - **基础格式**:加粗、斜体、删除线、高亮、上标、下标 - **代码**:行内代码、代码块(多语言语法高亮) - **列表**:无序、有序、任务列表(可交互勾选) - **数学公式**:KaTeX 渲染 - **图表**:Mermaid 渲染 - **表格**、**目录** `[TOC]`、**JSON 折叠查看器** - **图片**:本地图片插入(自动复制到笔记目录 + base64 渲染) ### 文件管理 - **侧栏文件树**:年/月层级目录,快速浏览切换 - **多标签**:固定笔记标签 + 外部文件标签 - **多格式支持**:`.md` `.txt` `.json` `.yaml` `.toml` `.xml` `.csv` 等 - **文件关联**:双击 `.md` 文件自动在 MGX 中打开 - **重命名 / 删除**:侧栏右键菜单操作 ### 自动保存 - 停止输入 1 秒后自动保存 - 切换文件前、应用退出前强制保存 - 状态栏实时显示保存状态(已保存 / 保存中… / 未保存) ### 云端同步(WebDAV) - **双向同步**:本地与 WebDAV 服务器自动同步 - **状态可视化**:侧栏文件点 — 绿色=已与云端同步,蓝色=本地有修改 - **安全存储**:WebDAV 密码以 AES-256-GCM 加密后写入配置文件 - **删除同步**:删除本地文件时可选同时删除云端副本 - **日志**:同步错误写入 `mgx.log`,级别可通过配置文件控制 ### 用户体验 - **双主题**:Light(暖白)/ Slate(暗色)一键切换 - **系统托盘**:关闭窗口后常驻托盘,全局快捷键随时唤起 - **开机自启**:可选开机自动启动 - **行号开关**:状态栏一键切换(ILP 模式自动隐藏) - **版本号**:状态栏右侧实时显示当前版本 ## 技术栈 | 层 | 技术 | |----|------| | 桌面框架 | Tauri 2 (Rust) | | 前端 | React 19 + TypeScript | | 编辑器引擎 | CodeMirror 6 | | 样式 | Tailwind CSS 4 | | 构建工具 | Vite | | Markdown 解析 | Marked | | 数学公式 | KaTeX | | 图表 | Mermaid | | 密码加密 | AES-256-GCM (Rust aes-gcm) | | HTTP 客户端 | reqwest (blocking) | ## 项目结构 ``` mgx/ ├── src/ # 前端源码 │ ├── App.tsx # 主应用组件(配置加载、标签管理) │ ├── components/ │ │ ├── Editor/ │ │ │ ├── MarkdownEditor.tsx # CodeMirror 6 编辑器 │ │ │ ├── MarkdownPreview.tsx # 实时预览(分屏) │ │ │ ├── ilp/ # Inline Live Preview 渲染引擎 │ │ │ │ ├── ilpPlugin.ts # CM6 装饰插件(块扫描/缓存/光标回退) │ │ │ │ ├── blockWidgets.tsx # 12 类块渲染 widget │ │ │ │ ├── IlpTocPanel.tsx # 浮动 TOC 目录面板(FAB + 展开面板) │ │ │ │ ├── inlineDecorations.ts # 行内格式装饰 │ │ │ │ ├── ilpScan.ts # lezer 语法树块扫描 │ │ │ │ ├── renderCore.ts # 共享渲染管线(与分屏预览共用) │ │ │ │ └── ilpState.ts # sourceMode/退化状态字段 │ │ │ ├── scrollSync/ # 分屏滚动同步(锚点定位 + 平滑跟随) │ │ │ ├── Toolbar.tsx # 格式工具栏 │ │ │ ├── Tooltip.tsx # 通用 Tooltip │ │ │ ├── EmojiPicker.tsx # Emoji 选择器 │ │ │ ├── ImageInsertDialog.tsx # 图片插入 │ │ │ ├── LinkConfirmDialog.tsx # 链接确认 │ │ │ └── JsonViewer.tsx # JSON 查看器 │ │ ├── Sidebar/ │ │ │ ├── Sidebar.tsx # 侧栏容器(可折叠) │ │ │ ├── FileTree.tsx # 文件树 │ │ │ └── FileTreeNode.tsx # 文件树节点(含同步状态点) │ │ ├── TitleBar.tsx # 自定义标题栏 │ │ ├── TabBar.tsx # 多标签栏 │ │ ├── StatusBar.tsx # 状态栏 │ │ ├── ConfirmDialog.tsx # 确认对话框 │ │ └── WebDAVSettingsPanel.tsx # WebDAV 配置面板 │ └── utils/invoke.ts # Tauri IPC 封装 ├── src-tauri/src/ # Rust 后端 │ ├── commands/ │ │ ├── file.rs # 文件 CRUD 命令 │ │ ├── config.rs # 配置读写命令 │ │ ├── sync.rs # WebDAV 同步命令 │ │ └── autostart.rs # 开机自启命令 │ ├── services/file_service.rs # 文件系统 I/O │ ├── utils/ │ │ ├── frontmatter.rs # YAML frontmatter 解析 │ │ ├── path.rs # 路径计算 │ │ └── log.rs # 日志写入(mgx.log) │ ├── config.rs # 配置结构体 + 读写 │ └── crypto.rs # AES-256-GCM 密码加解密 ├── index.html # 应用入口(含 splash screen) ├── package.json └── README.md ``` ## 开发 ### 环境要求 - Node.js 18+ - Rust 1.70+ - npm ### 安装依赖 ```bash npm install ``` ### 开发模式 ```bash npm run tauri dev ``` ### 构建(MSI/NSIS 安装包) ```bash npm run tauri build ``` ### Android 构建(移动端) 前提环境(一次性): 1. **JDK 17**(`JAVA_HOME` 指向 JDK 17) 2. **Android SDK**:`ANDROID_HOME` 指向 SDK 根目录;SDK Manager 内装 NDK(27.x)、CMake、Platform 35+、Build-Tools 35+ 3. **Rust android 目标**: ```bash rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android ``` 4. **国内网络**:`src-tauri/gen/android/build.gradle.kts` 已前置阿里云 Maven 镜像(google/public),海外环境可注释掉还原官方源 开发调试(连接真机开启 USB 调试,或运行中的模拟器): ```bash npm run dev:android # tauri 自动选用在线设备;首次编译 10–30 分钟 ``` 打包 Release APK(默认 debug 签名,可直接安装): ```bash npm run build:android adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/arm64/release/app-universal-release.apk ``` Windows 一键脚本(构建 + debug 签名 + 可选安装,注意脚本文件为 ASCII-only): ```bat scripts\build-android.bat --install REM 构建 aarch64 并安装到在线设备 scripts\build-android.bat --all REM 构建全部 4 个 ABI(模拟器用) ``` 正式签名(发布用)超出本仓库默认配置,生成 keystore 模板: ```bash keytool -genkey -v -keystore mgx-release.keystore -alias mgx -keyalg RSA -keysize 2048 -validity 10000 # 在 src-tauri/gen/android/keystore.properties 配置 storeFile/storePassword/keyAlias/keyPassword # 并在 app/build.gradle.kts 的 signingConfigs 里引用(tauri 官方文档 Android 签名章节) ``` 移动端代码入口:`src/mobile/`(`VITE_PLATFORM=android` 时经 `scripts/frontend-build.mjs` 切换),后端命令与桌面共享(平台差异以 `#[cfg(target_os = "android")]` 拆分)。图标准一源:根目录 `mgx.png`(`npx tauri icon mgx.png` 重生成全套)。 ## 配置文件 应用配置存储在 `mgx.conf`(JSON 格式,与可执行文件同目录): ```jsonc { "ui": { "theme": "light", // "light" | "slate" "sidebarCollapsed": false, "editorFontSize": 15, "autostart": false }, "session": { "selectedNote": null, "externalTabs": [] }, "sync": { "enabled": false, "url": "", "username": "", "passwordEnc": "", // AES-256-GCM 加密 "passwordIv": "" }, "export": { "dir": "" // 导出目录(设置页选择;空 = 平台默认) }, "log": { "level": "error" // "error" | "warn" | "info" } } ``` ## 版本历史 ### v3.1.6 (2026-08-29) - ✨ 移动端(Android):导出目录设置(SAF 目录选择 + 可写探针)、文件列表/编辑/预览/设置完整屏幕、物理返回键语义、ILP 触屏手势 - ✨ 键盘避让滚动:键盘打开编辑态默认滚到键盘上方、光标居中;打字不贴底,手动滚动自由 - ✨ 同步/导出结果 Toast 反馈;同步完成报文件数 - 🐛 代码审查修复轮(约 45 项):WebDAV 同步引擎加固(async 化/PROPFIND/原子写/冲突去重/重命名语义)、编辑器 flush 闭环(删除/重命名复活文件)、ILP 正确性与性能([X] 勾错行/监听器泄漏/围栏吞内容/calc 误判/每键全文档扫描)、加密改随机 keyfile.bin、命令清单宏去重 - 🐛 移动端:导出目录 SAF 桥、搜索框双清除钮、ILP 行内图片尺寸、删除/重命名前 flush、同步错误提示 ### v3.1.2 (2026-08-25) - 🐛 修复:ILP 下 TOC 目录跳转(虚拟化盲区)、行内标记转义误配、图片二次缩放、配置默认值、字号持久化 ### v3.1.1 (2026-08-25) - ✨ 新增:Inline Live Preview(ILP)模式——markdown 在编辑器内就地渲染,与分屏预览互斥切换 - ✨ 新增:12 类块级渲染 + 行内格式实时渲染 + 渲染块点击退化编辑 - ✨ 新增:工具栏 H5/H6 标题按钮、ILP 打印支持 - 🎨 改进:渲染与预览共享管线、Slate 主题对比度修复、内容 98% 宽度 - 🐛 修复:分屏 mermaid 混排渲染、切换白屏、TOC 跳转等 ### v2.3.7 (2026-08-25) - ✨ 新增:编辑器 ↔ 预览同步滚动重做,块锚点像素级定位(代码块内、表格、嵌套列表精确同步) - ✨ 新增:预览滚动跟随平滑化,编辑器滚动时预览短滞后缓动跟随;光标跨块仍瞬时 - 🎨 改进:预览用户滚动后 1.5s 暂停同步,图片加载不抢焦点 - 🐛 修复:代码块内同步失效、WebDAV 重命名同步、slate 编辑器配色、分 tab 打印 ### v2.3.6 (2026-08-24) - 新增:状态栏右侧显示版本号 - 新增:Splash 屏铺满全屏,显示时长 300ms - 新增:mgx.log 日志文件 + `log.level` 可配置日志级别(默认 error) - 修复:WebDAV 同步 URL 解析错误(href 路径组件正确解析) - 修复:URL 百分号编码文件名与本地文件名匹配 - 修复:第二次同步误报冲突(local_mtime / remote_mtime 分开追踪) - 修复:同步配置被 UI 配置保存覆盖(set_config 保留 sync 字段) - 修复:保存后绿点不变蓝(syncedPaths 在保存后刷新) - 修复:同步完成后自动刷新文件树 - 修复:删除对话框"删除本地及云端"按钮文字截断 ### v2.3.1 (2026-08-21) - 新增:WebDAV 双向云同步(上传/下载/冲突检测) - 新增:WebDAV 密码 AES-256-GCM 加密存储 - 新增:侧栏同步状态点(绿=已同步,蓝=本地有修改) - 新增:快捷键(Ctrl+B, Ctrl+I, Ctrl+K, Ctrl+`) - 新增:工具栏格式智能 toggle - 新增:JSON 代码块折叠查看器 - 修复:重命名文件竞态条件 - 改进:中文 NSIS 安装程序 ### v2.1.0 - 新增:多标签页支持(固定笔记 + 外部文件) - 新增:Light / Slate 双主题切换 - 新增:开机自启支持 ## 许可证 Copyright © 2026 Given. ltd. --- **MGX** — 专注于写作,享受 Markdown