命令行待办事项应用是开发者日常效率工具链中的重要一环。不同于图形界面工具,这类应用以极简主义哲学为核心,通过终端指令快速记录、管理任务,特别适合需要频繁切换工作环境的技术从业者。我在过去三年中尝试过十余款类似工具,最终发现自建解决方案最能贴合个人工作流。
这个项目的独特价值在于:
经过对比三种常见方案后选择JSON存储:
python复制# 数据结构示例
{
"tasks": [
{"id": 1, "content": "修复登录API漏洞", "done": false},
{"id": 2, "content": "编写单元测试", "done": true}
],
"next_id": 3
}
不选用SQLite的原因:
采用动词+名词的命令结构:
bash复制# 添加任务
todo add "完成项目文档"
# 标记完成
todo done 3
# 列出待办
todo list
这种设计比交互式CLI更符合Unix哲学:
采用自增ID而非UUID的考量:
python复制def get_next_id():
with open(DB_FILE) as f:
data = json.load(f)
next_id = data["next_id"]
data["next_id"] += 1
with open(DB_FILE, 'w') as f:
json.dump(data, f)
return next_id
注意:需要文件锁机制防止多进程竞争,建议使用fcntl(Linux)或msvcrt(Windows)
使用ANSI转义码而非第三方库:
python复制def color_print(text, color):
codes = {"red": "\033[91m", "green": "\033[92m"}
print(f"{codes[color]}{text}\033[0m")
实测性能比colorama快3倍,且无依赖问题
python复制import argparse
import json
import os
DB_FILE = os.path.expanduser("~/.todo.json")
def init_db():
if not os.path.exists(DB_FILE):
with open(DB_FILE, 'w') as f:
json.dump({"tasks": [], "next_id": 1}, f)
def add_task(content):
# 实现细节见3.1节
pass
def list_tasks(show_all=False):
# 带颜色输出的任务列表
pass
def complete_task(task_id):
# 标记任务完成
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command')
# 各子命令配置
add_parser = subparsers.add_parser('add')
add_parser.add_argument('content')
# 其他命令...
args = parser.parse_args()
init_db()
if args.command == 'add':
add_task(args.content)
# 其他命令处理...
使用AES加密敏感任务:
python复制from Crypto.Cipher import AES
def encrypt(content, key):
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(content.encode())
return cipher.nonce + tag + ciphertext
注意:密钥需要保存在系统密钥环中,不要硬编码在代码里
通过Git实现版本控制:
bash复制#!/bin/bash
# 在每次操作后自动提交变更
cd ~/.todo
git add todo.json
git commit -m "Update tasks"
配合cron定时拉取远程变更:
bash复制*/5 * * * * cd ~/.todo && git pull --rebase
采用原子写入模式防止数据损坏:
python复制import tempfile
def safe_write(data):
with tempfile.NamedTemporaryFile('w', dir=os.path.dirname(DB_FILE)) as tf:
json.dump(data, tf)
tf.flush()
os.replace(tf.name, DB_FILE)
对频繁执行的list操作添加LRU缓存:
python复制from functools import lru_cache
@lru_cache(maxsize=1)
def get_tasks():
with open(DB_FILE) as f:
return json.load(f)["tasks"]
缓存有效期5秒,平衡实时性与性能
创建软链接到PATH目录:
bash复制chmod +x todo.py
ln -s $(pwd)/todo.py /usr/local/bin/todo
每日凌晨压缩备份:
bash复制0 3 * * * tar czf /backup/todo_$(date +\%Y\%m\%d).tgz ~/.todo.json
保留最近7天备份:
bash复制find /backup -name "todo_*.tgz" -mtime +7 -delete
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 命令无响应 | 文件权限问题 | chmod 600 ~/.todo.json |
| 显示乱码 | 终端不支持ANSI颜色 | 设置TERM=xterm-256color |
| 添加重复任务 | 内容完全相同 | 添加时间戳后缀 |
| 同步冲突 | 多设备同时修改 | 手动合并冲突的JSON文件 |
我在实际使用中遇到过最棘手的问题是Windows和Linux换行符差异导致的JSON解析失败,最终通过统一使用LF格式解决了问题。另一个实用技巧是为常用任务添加快捷键:
bash复制alias t='todo list'
alias ta='todo add'