「私をn個増やしなさい」タスク(clone task)
demo
tritaskの話
こういうことをよくする
第二領域的なタスクT1をrep:1でセットしている
こうすれば毎日取り組めるからね
が、1日n回取り組みたいことがある
このときどうするか?
従来は以下になる
T1を終わらせたあと、T1を複製してrep:1を抜いたT2をつくる
このT2をn個複製する
面倒くさい
一気につくれたらいいなぁと思った
つまり、
cloneme:1
みたいな属性をつくる
clone me
値は使わないのでなんでもいい(tritaskの慣例ではdummy値は1)
cloneme属性のついたタスクを実行すると、ユーザーに「これ何個複製します?」を尋ねる
4個とか答えると、4個複製される
で、元のタスク自体も終了する
---
これがあれば、 cloneme:1 rep:1
とつけることで、「n個繰り返すという挙動を行うタスク」を毎日繰り返す、になる
実質「毎日 "その日その時にn個増やす"」を実現できる
上記の面倒くささをだいぶ解消できている
実装のつもりが設計。が、たぶん天才
cloneme属性をつくる
.
スタートは秀丸エディタのダイアログでnを入力させたところから
helper.pyにはnを与える
他にも現在行を与える or 与えないがある
与えない場合、clone対象を調べるには「clonemeがついてる」「開始中である」まで必要
---
与えない場合は、helper.py側で全面的に処理する形になる
与える場合は、cloneme属性がそもそも要らない
単に「n個増やす(ただしrepは除く)」「元のタスクは普通に終了する」をするだけ
最初にダイアログでnを入れるところは確定
つまり「clonemeをしますよ」という操作を呼び出している
だったら先にnを全部入力しておいて、一気に実行した方がいいんじゃないか?
trita 2022/06/08 Wed vip1 clone:0
2022/06/08 Wed vip2 clone:0
2022/06/08 Wed vip3 clone:0
ソートすると
こうなる.trita2 2022/06/08 Wed vip1
2 2022/06/08 Wed vip1
2 2022/06/08 Wed vip2
2 2022/06/08 Wed vip2
2 2022/06/08 Wed vip2
2 2022/06/08 Wed vip3
3 2022/06/09 Thu vip1 clone:0
3 2022/06/09 Thu vip2 clone:0
3 2022/06/09 Thu vip3 clone:0
これがいいだろ
---
実装も難しくない
helpler.py側で、単に clone:ここが0じゃないタスク
を全部処理すればいい
0じゃないタスクを処理したら、そのタスクの分は0にする
複製するタスクは today todo にする
これがあるのでもし未来日にclone:nが残ってたとしても、それがtodayに来るから気づける
死角なし
実装
sort.py if args.sort:
apply_holding(lines)
apply_skipping(lines)
apply_completion(lines)
apply_duplicates(lines)
lines.sort()
return True
apply_cloning()
linesは破壊的
最後にソートするからappendでいい
Task
clone:n(n>1)があったら、nを0にする
Trueを返すことで「これcloneeやで」を示す
実際にcloneするのはapplyerがやる
あああああ、
self._options
をto stringすることが想定されてない……
そもそもTaskインスタンスからto stringすることを想定してないいやそれはしてる
tostringしとるやろ.py def __str__(self):
return '{0} {1} {2} {3} {4} {5}'.format(
self._sortmark, self._date, self._dow,
self._starttime, self._endtime,
self._description
)
ただdescritionsの中にoptionsがそのまま埋め込まれてる
横着するしかないか
descriptionsを文字列的にreplaceする
なんかlinesが更新されん
pydef apply_cloning(lines):
newlines = []
for i, line in enumerate(lines):
if line.find('clone:') == -1:
newlines.append(line)
continue
task = Task(line)
clonee_count = task.get_clonee_count()
if clonee_count == 0:
newlines.append(line)
continue
task.reset_clonee_count()
newline = str(task)
newlines.append(newline)
for i in range(clonee_count):
cloned_task = Task(line)
cloned_task.remove_clonee_option()
cloned_task.to_todaytodo()
newline = str(cloned_task)
newlines.append(newline)
lines = newlines
このとき呼び出し元のlinesってnewlinesにならんのだっけ?
参照だし、なると思うんだけど
なんでだっけ
なるだろ?
通った
だるいので通ったコード載せないけど
test
テストコードもok
trita1 2022/06/09 Thu 00:00 00:00 ---- TODAY DONE hold:0
2 2022/06/09 Thu ---- TODAY TODO hold:0
2 2022/06/09 Thu 0 休憩 clone:0
2 2022/06/09 Thu 0 散歩 clone:0
2 2022/06/09 Thu 1 本XXXを読みたい clone:0
2 2022/06/09 Thu 2 YYYの執筆 clone:0
2 2022/06/09 Thu task1
2 2022/06/09 Thu task2
2 2022/06/09 Thu task3
3 2022/06/10 Fri ---- TOMORROW TODO hold:1
gif
まず最初に clone:★ここを指定している★
2と書いたら「今日は2回やる」の意
終わったらソートする
すると、指定した回数分だけタスクが増えている!
Diary
2022/06/09 20:25:51 できたと思うのでしばらく手元で試す
2022/06/16 21:02:41 便利