Evthron's blog

定製 Taskwarrior

Taskwarrior 是一個簡單不花俏,功能豐富的待辦清單軟件。我自己改裝了一下。

第一是實現了性價比排序功能。這是模仿 Supermemo 裏的 tasklist 功能,可以每個任務估算時間和價值,然後按照價值除以時間,也就是性價比排序。

首先在 taskrc 裏設定 UDA (User Defined Attributes,用户定義的屬性)分別是 Time, Value,和 Worth(= Value / Time)。

# 不知道為什麼,要是把 Time 和 Value 和定義為 numeric type 的話,顯示就會延伸到小數後很多位。
uda.time.type=string
uda.time.label=Time
uda.value.type=string
uda.value.label=Value
uda.worth.type=numeric
uda.worth.label=Worth

然後修改 report.list 的欄位,加入 Time, Value,和 Worth

default.command=list # 輸入 task 的時候自動執行 task list,而不是 task next
report.list.columns=id,start.age,entry.age,depends.indicator,priority,project,tags,recur.indicator,scheduled.countdown,due,until.remaining,description.count,time,value,worth
report.list.labels=ID,Active,Age,D,P,Project,Tags,R,Sch,Due,Until,Description,Time,Value,Worth

最後是根據 worth,也就是性價比排序

report.list.sort=worth-,start-,due+,project+

例子:

> task add 買牛奶 time:60 value:30
# 買牛奶要花 60 分鐘
# 我覺得買牛奶對我來説值 30 元

# 顯示效果
ID | Active | Age | Description | Time | Value | Worth  |
19 |        | 1s  | 買牛奶      |  60  |  30   | 0.500  |

要讓 taskwarrior 自動計算性價比,就需要用到 hooks,也就是自動和 taskwarrior 一起運行的程序。寫兩個 Shell Script,分別是 on-add.01.prioirty 和 on-modify.01.priority,一個在增加任務的時候執行,另一個在修改任務的時候執行。兩個 Shell Script 的內容是一樣的。

#!/usr/bin/env bash
TASK=$(</dev/stdin) 
echo "$TASK" | python "$HOME/.config/task/hooks/priority.py" $@ 

每次增加或者修改任務,任務就會以 JSON 的形式交給 priority.py 處理,計算任務的性價比。

import sys
import json

try:
    task = json.loads(sys.stdin.readline())
except json.decoder.JSONDecodeError:
    pass
    
# worth calculation
if 'time' in task.keys() and 'value' in task.keys():
    task['worth'] = str("{:.3f}".format(int(float(task['value'])) / int(float(task['time']))))

print(json.dumps(task))

第二是我用了 task2hab (github) 這個插件,可以自動把 taskwarrior 的任務同步到 habitica 上。另外我還模仿了另一個插件 taskwarrior-habitica-bridge (github),修改了一點代碼,讓完成任務的時候可以在終端裏顯示賺到的經驗和金幣。因為這個不是我寫的,我就不展開説了。