tt-focus: 专门为了帮助集中注意力而设计的命令行时间记录器
Command-line time tracker to help focus.
tt-focus 有两大特点:
- 是一个纯命令行程序
- 主要用途不是记录时间使用情况,而是帮助集中注意力
比如吃饭、睡觉、做运动、娱乐等的时间记录 不适合 使用本软件。
而写作、学习、编程等,就 适合 使用本软件。
安装
本软件使用了 Python 3.10 的新特性,如果你的系统中未安装 Python 3.10, Windows 用户可直接到 Python官网 下载最新版安装即可。 Linux, MacOS 推荐使用 pyenv 或 miniconda 来安装最新版本的 Python。
在有了 Python 3.10 之后,安装本软件非常简单,只要 pip install tt-focus
即可。
设置语言
- 程序界面默认是英语,但可设置为中文:
tt set -lang cn
- 也可随时设置为英语:
tt set -lang en
添加任务类型
在第一次使用之前,必须至少添加一种任务类型。例如:
-
tt add coding
(添加任务类型 coding) -
tt add reading -alias 读书
(添加任务类型 reading 及其别名) -
tt list -t
(查看已添加的任务类型)
任务类型的名称及其别名可以随时修改,方法详见 readme.md
开始工作 (启动一个事件)
$ tt start coding
事件 id:rcdrdg, 任务: coding (编程), 开始于 17:22:28
暂停 (休息/摸鱼)
当你需要稍稍休息一下,可使用该命令 tt pause
或 tt -p
恢复 (回到工作)
从休息中回到工作时,可使用该命令 tt resume
或 tt -r
查看状态
可随时使用命令 tt status
或 tt -s
查看当前事件的用时情况,例如:
$ tt -s
Task | coding (编程)
Event| (id:rcbpba) 2022-05-23 **running**
total 14:42:46 -> 16:50:45 [0:41:34]
-------------------------------------
Split 14:42:46 -> 15:24:20 [0:41:34]
Pause [0:44:37]
Split 16:08:57 .. 16:50:45 [0:41:48]
结束
- 工作结束,或者需要长时间休息时,使用命令
tt stop
结束一次计时。 - 结束后,会显示 "生产效率/集中力"(productivity), 意思是从该事件的开始到结束这段时间内,工作时间所占的比例。
事件列表
-
tt list
查看最近发生的事件。 -
tt list -v
查看最近事件,并且显示更详细的信息。 -
tt list <event id>
查看指定事件的详细信息。
使用感受
就我自己的情况,实际使用后最大的感受是,有效地意识到自己在干什么(在工作、还是在摸鱼?),这点对集中精神、提高生产力很有帮助。
本软件功能简单,因此源代码也简单,其中看起来行数较多,但大部分是中英双语提示内容,真正的功能代码不多,而且结构清晰,懂 Python 的人可轻松修改或添加自己想要的功能。
吸收了 Rust 与 Go 的错误处理思想
Rust
这次在技术上做了一个尝试,采用了一个模仿 Rust 的 result[ok, err], 它的优点是:
- 当不需要处理错误时,可以直接
unwrap
, 把有可能发生的 Exception 抛给上层。 - 当需要处理错误时,可以用
is_err()
判断有无异常,也可以用err()
获取错误内容,还可以用 Python 3.10 的 match...case 模式匹配来区分有异常与无异常两种情况。
Go
同时,在使用 Go 的过程中学习到了区分 Exception 与 Error 的好处。
- Exception 是真的意外情况,不应抛给用户,一旦发生 Exception 就表示有 bug。
- Error 是可预见,是一定会发生的,是必须提前处理的,并且通常可以给用户有意义的提示。比如,假设用户名不允许使用中文,而用户输入了中文,此时,处理用户名的函数就应该返回 Error 而不是抛出异常。
结合起来
基于以上两种思想,我这次很多函数的返回值都类以这样 Result[User, MultiText]
, 其中 MultiText 只是一个简单的 dataclass:
from dataclasses import dataclass
@dataclass
class MultiText:
cn: str
en: str
这样,只需要对返回值做一个简单的判断,就能获得 User, 或者获得一个双语的错误信息。