todo.txt 高级搜索——按 @上下文、+项目、优先级一键过滤
为什么高级搜索重要
todo.txt 文件可以慢慢积累几百个任务。手动 grep 能过滤,但:
- grep 需要在终端里跑,手机上不方便
- grep 过滤后看不到其他上下文(比如只看 @phone 的任务,同时还想知道它们的优先级)
- grep 没有 Markor 的语法高亮配合
v2.11 新增的高级搜索直接内建到 Markor 的 todo.txt 对话框里,让过滤 + 高亮 + 批量操作三合一。
打开高级搜索
- 打开一个 todo.txt 文件
- 点底部操作栏的 搜索图标(🔍)
- 弹出搜索对话框
- 点搜索框旁边的 「高级搜索」 或 ⚙️ 齿轮图标(v2.11 版本)
支持的过滤维度
| 过滤条件 | 语法 | 说明 |
|---|---|---|
| 优先级 | priority:A / priority:B / priority:high / priority:all | 按括号里的字母过滤 |
| 上下文 | context:home / @home | 按 @ 标记过滤 |
| 项目 | project:work / +work | 按 + 标记过滤 |
| 状态 | state:open / state:done / state:all | 只看未完成 / 已完成 / 全部 |
| 关键词 | 直接输入任意文本 | 在任务描述里模糊搜索 |
| 到期日期 | due:2026-10-15 / due:tomorrow | 部分版本支持 |
组合搜索
多个条件可以 组合 使用,比如:
state:open priority:A @work +app-redesign
意思是:过滤出当前未完成、优先级 A、属于工作场景、属于 app-redesign 项目的所有任务。
搜索结果会在编辑器里高亮显示,非匹配的任务会被淡化或隐藏(取决于你选的视图模式)。
搜索结果的批量操作
搜索结果显示后,你可以:
- 批量标记完成:对所有匹配项一次性加
x和日期 - 批量修改优先级:把 A 优先级改成 B
- 批量删除:删除所有匹配任务
- 批量改上下文 / 项目:在任务文本里追加
@newcontext或+newproject
这个能力在每周回顾时特别好用——一键找出所有 priority:A 但已完成日期超过 7 天的任务,批量归档到 done.txt。
和 grep 的对比
| 维度 | Markor 高级搜索 | grep 命令行 |
|---|---|---|
| 操作 | 点几下对话框 | 输命令 |
| 语法高亮 | ✅ 过滤结果在编辑器里保留高亮 | ❌ 纯文本输出 |
| 批量操作 | ✅ 直接在 Markor 里改 | ❌ 需要配合 sed/awk |
| 跨平台一致性 | ❌ 只有 Markor 有 | ✅ 任何终端都能用 |
| 速度 | 文件多时略有延迟 | 极快 |
最佳策略:Markor 手机上用高级搜索,桌面端用 grep/sed 脚本定期做批量归档和统计。两者配合,文件内容不受任何一方影响。
高级搜索的限制
- 高级搜索目前只在 todo.txt 格式 的文件上可用,Markdown / AsciiDoc 等格式的文件搜索用的是通用的「编辑器内搜索」
- 部分复杂组合(如日期范围过滤)在早期版本里可能还不完善,v2.11+ 才比较完整
- 搜索不会创建索引,每次都是 实时扫描——文件超过 2000 行时可能有几秒钟延迟
进阶:桌面端同步脚本
当 Markor 的 todo.txt 同步到桌面后,你可以写一些简单的 shell 脚本配合 grep:
# 找出所有 A 优先级任务
grep "^(A) " todo.txt
# 统计 @home 上下文的任务数量
grep "@home" todo.txt | wc -l
# 找出所有已完成但超过 30 天的任务
grep "^x " todo.txt | awk '$2 < "'$(date -d '30 days ago' +%Y-%m-%d)'"'
# 把已完成任务归档
grep "^x " todo.txt >> done.txt && sed -i '/^x /d' todo.txt
这些脚本在 macOS / Linux 上直接用,Windows 上用 Git Bash / WSL / PowerShell 的 Select-String 也能实现。