Files
Todo-List/README.md
2026-09-12 13:55:57 +08:00

6.9 KiB
Raw Blame History

Todo List

一个简洁的桌面 Todo 应用——Markdown 文件是真相之源,软件只是友好的外壳。

任务存在一个普通 .md 文件里任何文本编辑器都能打开、编辑、同步、diff。没有数据库没有锁没有私有格式。

为什么用它

  • 零锁定 —— todo.md 永远可读。删掉应用也不丢任何数据。
  • 极简模型 —— 任务只有四个字段:文本、勾选、 重要、▶ 当前。没有标签、优先级、截止日期、子步骤。
  • 数据归属明确 —— 勾选 = 移到「已完成」;删除 = 移到「回收站」。一个任务永远只在一个地方。
  • "当前 / 重要"是视图,不是文件段 —— 任务打上 [▶] / [⭐] 行内标记后由 UI 聚合呈现,文件里不会出现重复镜像。
  • 永远不让你"丢东西" —— 没有"清空回收站"按钮,彻底删除只能手动编辑 Markdown。

快速开始

需要 Node.js 18+。

npm install
npm start

路径要求:项目目录必须放在 ASCII 路径下(如 C:\dev\todo-list)。路径含中文时 Electron 会因 require('electron') 返回路径字符串而启动失败、看不到窗口。临时绕过:在 ASCII 位置建符号链接再启动:

mklink /D C:\dev\todo-list "D:\data\正在工作\Todo List"
cd C:\dev\todo-list && npm start

数据文件位置:~/TodoList/todo.md(可在设置里改;仅允许用户主目录 / 文档 / 下载 / 桌面 / AppData 下的子目录)。

文件长什么样

# 全部任务

## 工作

- [ ] 完成 Q3 设计文档
- [ ] [▶] 写季度汇报
- [ ] [⭐] 给客户回邮件

# 已完成任务
# 回收站

四个标记,零元数据:

写法 含义
- [ ] 未完成
- [✓] 已完成
[▶] 当前任务(出现在「当前任务」视图)
[⭐] 重要任务(出现在「重要任务」视图)
[原分类xxx] 自动归档归属(仅在「已完成」/「回收站」里出现)

写入器固定输出顺序:- [✓] [▶] [⭐] [原分类xxx] 任务文本。完整示例见 data/todo.example.md

侧边栏

侧边栏顶部是 4 个跨子分类聚合的智能视图,下面是用户用 ## 子分类名 自由组织的子分类(含不可删的「未分类」兜底):

视图 说明
当前任务 所有打了 [▶] 的未完成任务
重要任务 所有打了 [⭐] 的未完成任务
全部任务 聚合显示所有子分类里的未完成任务
已完成任务 跨分类聚合的已完成任务

智能视图用 Alt+1 / 2 / 3 / 4 切换。

快捷键

操作 快捷键
添加任务 Enter(在底部输入框)
勾选 Space
编辑 F2
删除(到回收站) Delete
标重要 / 当前 Ctrl/Cmd+I · Ctrl/Cmd+T
搜索 Ctrl/Cmd+F/
过滤菜单 F
命令面板 Ctrl/Cmd+K
新建子分类 Ctrl/Cmd+Shift+N
设置 Ctrl/Cmd+,
切换主题 Ctrl/Cmd+Shift+T
切换智能视图 Alt+1 当前 · Alt+2 重要 · Alt+3 全部 · Alt+4 已完成
列表内导航 / · Home / End · PageUp / PageDown
立即重新加载 Ctrl/Cmd+R
开发者工具 F12

四个操作搞定 80% 场景

想做什么 怎么做
添加任务 底部输入框打字,回车
标"今天要做" 任务前打 [▶] 或按 Ctrl/Cmd+T
标"重要" 任务前打 [⭐] 或按 Ctrl/Cmd+I
完成 / 删除 勾选 → 自动到「已完成」;点 × → 自动到「回收站」

命令

npm start                  # 启动(推荐,自动修中文乱码)
npm run start:raw          # 直接起 Electron仅排查启动脚本时用
TODO_DEVTOOLS=1 npm start  # 启用远程调试端口 9222外部 DevTools / Playwright 接入)
npm run check              # 跑 47 项自检、约 1200 条断言
npm run build              # 打包当前平台
npm run build:win          # WindowsNSIS .exe
npm run build:mac          # macOS.dmg
npm run build:linux        # Linux.AppImage

产物输出到 dist/

功能一览

  • 智能视图:当前 / 重要 / 全部 / 已完成(按行内标记跨子分类聚合)
  • 任务分类:用 ## 子分类名 自由组织,含「未分类」兜底
  • 过滤 / 排序:全部 / 当前 / 已完成 / 重要 · 手动 / 字母(全局偏好持久化)
  • 拖拽子分类间、任务间、任务到侧边栏Pointer Events不依赖 HTML5 drag API
  • 批量操作:选择模式多选,一键移动 / 置顶置底 / 标重要当前 / 完成 / 删除
  • 导入:粘贴大段文本按行解析成任务,支持保留 - [✓] 状态
  • 冲突解决:任务粒度三栏合并(用文件 / 用本地 / 保留两边 / 都不要),附 LCS 行级 diff 预览
  • 搜索:全局模糊匹配 + Ctrl/Cmd+K 命令面板(搜索列表 / 跳转 / 切换主题等)
  • 个性化:字体大小(小 / 标准 / 大)× 配色风格(靛蓝 / 海洋 / 森林 / 日落 / 玫瑰 / 单色,各含深浅两版)
  • 主题:深色 / 浅色 / 跟随系统;与配色风格正交
  • 托盘 / 始终置顶 / 单实例锁:关闭窗口默认隐藏到托盘;同目录同时只允许运行一个实例
  • 6 个插入位置偏好:新增 / 完成 / 取消完成 / 删除 / 恢复 / 移到分类各自选"前面 / 后面"

数据安全

  • 实时同步 —— 每次操作立即落盘800ms 防抖),状态栏显示「已同步 HH:MM」
  • 外部修改检测 —— fs.watch + 250ms statSync(mtime/size) 轮询兜底(云盘 / 网络盘 / 非标准保存路径的编辑器也能感知)
  • 冲突合并 —— 磁盘版本与本地版本不一致时弹任务粒度三栏合并对话框
  • 原子写入 —— tmp + rename 落盘,永远不会半截
  • .bak 三份轮转 —— 每次保存保留最近 3 份回退点
  • 带标签快照 —— 用户主动丢弃编辑、退出前 flush、reload 前等关键节点生成带时间戳的快照,永不轮转
  • .pre-crash.bak 兜底 —— 退出前 flush 超时5 秒)自动备份当前内容
  • 每日快照 —— backup/todo-YYYY-MM-DD.md,默认开启
  • 数据目录沙箱 —— 所有文件 IO 必须落在数据目录内;自定义目录必须在用户已知根目录下
  • 单文件上限 50 MB —— 防止异常数据把目录撑爆
  • 彻底删除只能手动编辑文件 —— 刻意的设计

跨设备同步

todo.md 放在云盘目录OneDrive / Dropbox / iCloud或在设置里改数据目录。或用 Git 管理每个任务一行diff 干净)。

开发者

关济寰 · guanjihuan.com/about

许可证

MIT