spinss

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

MDeX · đọc là "em-dex" (/ˌemˈdɛks/) — chữ M theo sau là "dex", gồm hai âm tiết.

Một trình đọc & soạn thảo Markdown đa ngôn ngữ tập trung vào quyền riêng tư và hỗ trợ AI. Mọi tệp đều được xử lý cục bộ — mặc định không mạng, không tải lên, không đồng bộ đám mây, không quảng cáo, không đo lường từ xa; lưu nguyên tử (chống sự cố) tránh mất dữ liệu khi sập chương trình hoặc mất điện. Kể từ v2.0, MDeX cũng cung cấp tính năng chỉnh sửa có hỗ trợ AI tùy chọn — và có thể vẫn hoàn toàn ngoại tuyến: một mô hình cục bộ (ví dụ Ollama) không cần internet; chỉ dịch vụ AI trực tuyến (OpenAI / DeepSeek / Anthropic / GLM / Gemini / Kimi v.v.) mới tạo yêu cầu mạng, và chỉ khi bạn cấu hình và kích hoạt nó.


🌐 Ngôn ngữ

Giao diện được cung cấp bằng 17 ngôn ngữ: English, 简体中文, Français, Deutsch, Español, Português, Italiano, Русский, 日本語, 한국어, العربية, हिन्दी, ਪੰਜਾਬੀ, Tiếng Việt, Bahasa Indonesia, اردو, Монгол (Кирилл).


✨ Tính năng


⌨️ Phím tắt

Dùng trên macOS, Ctrl trên Windows / Linux.

Phím tắt Hành động
⌘/Ctrl + N Mới
⌘/Ctrl + O Mở tệp
⌘/Ctrl + S Lưu
⌘/Ctrl + Shift + S Lưu thành
⌘/Ctrl + W Đóng thẻ
⌘/Ctrl + Shift + W Đóng cửa sổ
⌘/Ctrl + F Tìm
⌘/Ctrl + H Thay thế
⌘/Ctrl + B / I / R Đậm / Nghiêng / Mã inline
⌘/Ctrl + K Chèn liên kết
Tab Thụt lề 2 khoảng trắng
Alt/Option + kéo Chọn hình chữ nhật (cột)
Alt/Option + Shift + ←↑↓→ Mở rộng chọn cột
Esc Hủy chọn cột
⌘/Ctrl + =/−/0 Thu phóng khung cuối cùng được nhấp (trình soạn thảo hoặc xem trước): phóng to / thu nhỏ / đặt lại
⌘/Ctrl + J Chỉnh sửa có hỗ trợ của AI

Khi có nhiều cửa sổ đang mở, phím tắt chỉ tác động lên cửa sổ đang được tiêu điểm. Khi cửa sổ trình xem hình ảnh đang mở, ⌘/Ctrl + =/−/0 thu phóng hình ảnh.


📝 Bảng tham chiếu nhanh

Markdown: tiêu đề # / ## / ###, đậm **text**, nghiêng *text*, gạch ngang ~~text~~, mã inline `code`, khối mã (ba dấu backtick, kèm ngôn ngữ tùy chọn), trích dẫn > text, danh sách - / 1., danh sách công việc - [ ] / - [x], liên kết [text](url), hình ảnh ![alt](url), vạch phân cách ---, bảng | A | B |.

Toán học: inline $E = mc^2$; khối $$\int_0^1 x\,dx$$ (có thể trải dài nhiều dòng). Sử dụng cú pháp LaTeX, render bởi KaTeX; $ bên trong khối mã không được xử lý như dấu phân cách toán. Hỗ trợ các môi trường phổ biến như align / aligned, ma trận, cases, v.v.

Trích dẫn: viết [@key] hoặc [@a; @b] trong văn bản (tương thích \cite{key} của LaTeX), nhúng thư viện qua khối ```bibtex hoặc tải tệp .bib bằng nút "Refs". Danh sách Tài liệu tham khảo được tạo ở cuối; [n] trong văn bản có thể nhấp được.


📤 Xuất (Lưu thành)

Nhấp "Lưu thành" và chọn định dạng:


🔒 Ngoại tuyến & bảo mật


📦 Cài đặt

Tải bản dựng sẵn

Tải bộ cài cho nền tảng của bạn từ một trong hai nguồn:

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

Mở ứng dụng chưa ký trên macOS (vượt qua Gatekeeper)

Ứng dụng này không được ký nhà phát triển / notarized (kịch bản ngoại tuyến thường không thể notarize trực tuyến). Trên macOS 12+, đặc biệt macOS 26 (Tahoe), việc khởi chạy thẳng từ .dmg — hoặc một bản dựng vừa sao chép — sẽ thất bại với thông báo "MDeX.app is damaged and can't be opened." Đó là Gatekeeper, không phải hư hỏng thực sự. Khắc phục trong Terminal:

  1. Trước tiên kéo MDeX.app từ .dmg vào /Applications — tuyệt đối không chạy thẳng từ dmg (điều đó kích hoạt App Translocation và thuộc tính com.apple.provenance, nguyên nhân thực sự của lỗi "damaged" trên macOS 26).
  2. Xóa thuộc tính và ký lại:
    xattr -cr /Applications/MDeX.app
    codesign --force --deep --sign - /Applications/MDeX.app

    com.apple.provenance được SIP bảo vệ và không thể gỡ bỏ kể cả với sudo; việc ký lại đặt lại chữ ký nên Gatekeeper cho phép chạy. spctl vẫn báo rejected với ký ad-hoc — đây là điều dự kiến, và nó không chặn open.

  3. Khởi chạy bằng open /Applications/MDeX.app (hoặc nhấp đúp). Lần khởi chạy đầu có thể vẫn hỏi một lần — xác nhận qua System Settings → Privacy & Security → Open Anyway, hoặc nhấp phải ứng dụng → Open.

🛠️ Build từ mã nguồn

Mã nguồn: https://github.com/fwzheng/mdex. Làm theo hướng dẫn build trong kho mã nguồn (thiết lập, phụ thuộc và lệnh được ghi trong đó).


📁 Cấu trúc dự án

markdown/
├── app-shell.html          # vỏ giao diện (HTML+CSS); logic ứng dụng nằm trong src/app.js
├── src/
│   ├── app.js              # logic ứng dụng (// @ts-check; được nhúng vào dist bởi build-html.mjs)
│   ├── 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        # khai báo kiểu vendor / Window cho kiểm tra kiểu
├── tsconfig.json           # cấu hình kiểm tra kiểu (tsc --noEmit; không bundler)
├── tools/
│   ├── fetch-vendor.mjs    # một lần: tải deps vào vendor/ + khóa toàn vẹn (chỉ bước này cần mạng)
│   ├── build-html.mjs      # nhúng vendor + src/app.js + i18n.js + help.js vào dist/index.html (font KaTeX → base64)
│   └── test-pure.mjs       # kiểm thử hàm thuần giao diện (npm test)
├── dist/index.html         # đầu ra build: tệp đơn độc lập (Tauri frontendDist)
├── vendor/                 # bộ nhớ đệm tải về + integrity.json (.gitignore)
├── package.json            # @tauri-apps/cli + typescript(dev) + scripts
└── src-tauri/
    ├── Cargo.toml          # tauri 2 + dialog / single-instance + encoding_rs
    ├── build.rs            # tauri_build::build()
    ├── tauri.conf.json     # cửa sổ 1200×750, CSP nghiêm ngặt, biểu tượng, liên kết .md, móc menu
    ├── capabilities/default.json
    ├── icons/              # bộ biểu tượng đầy đủ từ `cargo tauri icon`
    └── src/{main.rs, lib.rs}   # menu + IO tệp + định tuyến đa cửa sổ + ghi nguyên tử / sở hữu tệp

🎨 Tùy biến

Để thay đổi Vị trí
Tên ứng dụng / Bundle ID src-tauri/tauri.conf.jsonproductName / identifier
Kích thước cửa sổ tauri.conf.jsonapp.windows[0] (mặc định 1200×750)
Biểu tượng thay ảnh nguồn, rồi npm run icon
Màu giao diện / font biến CSS :root ở đầu app-shell.html
Mục menu build_menu() trong src-tauri/src/lib.rs
Chuỗi UI / tài liệu trợ giúp I18N / HELP_STRINGS trong src/app.js
Phiên bản dependency VERSIONS ở đầu tools/fetch-vendor.mjs (rồi npm run fetch -- --force)

📄 Giấy phép

Mã nguồn riêng của dự án này là mã nguồn mở theo Apache License 2.0.

Thành phần bên thứ ba: dự án sử dụng một số thành phần bên thứ ba (bao gồm nhưng không giới hạn marked, KaTeX, highlight.js, DOMPurify, jsPDF, html2canvas-pro, turndown, mermaid, @retorquere/bibtex-parser và Tauri, v.v.); thông báo bản quyền và giấy phép chi tiết nằm trong các tệp nguồn tương ứng. Các thành phần này tương ứng dưới các giấy phép MIT, BSD-3-Clause, Apache-2.0, MPL-2.0 và các giấy phép nguồn mở khác.

Yêu cầu phân phối: theo giấy phép Apache-2.0, khi phân phối lại dự án này phải giữ lại các tệp LICENSE và NOTICE; nếu bạn sửa đổi tệp nguồn, phải ghi rõ thay đổi trong tệp tương ứng.


📬 Liên hệ

Về vấn đề hoặc góp ý: 郑法伟 (Fawei Zheng) fwzheng@bit.edu.cn