Skip to content

todo 描述语言

一个计划的模样

- desc: 放计划描述
  nexttime: 0      # 下一次输出这个任务的时间,0 代表明天,1 就是后天,依次类推
  period: 7        # 循环周期,每 7 天输出一次。如果想每天都输出,改为 1 即可
  assign:
    to: myself
    via: web
  style:
    separator: ,
  comment: 可以删除本行,作用是对任务性质的描述,类似注释

简写

d = day m = month y = year

星期、月份按照英语中的缩写

计划之间的关系

添加标签

计划如果加字段 tag: tag_name(tag_name 是自定义的字符串),当计划被触发时,此 tag_name 即可被其他计划使用,通过 except、start_if、stop_if、del_if、delay_if、if 等

  tag: sunday

也可以指定多个

  tag: [sunday, a_week, a_month]

除了某一天 except

搭配匹配模式,符合则不输出。

可以和任何任务搭配,后面可以跟的内容和 if 相同。

- desc: 每天都会输出这个任务,除了周日
  every: day
  except: Sun   # 同样支持列表

延迟执行

添加键值对 delay_if: tagname 后,当要执行时却遇到了 tagname,会在下一次不满足 tagname 时立刻执行。并会提示被延期了。

周六的计划,如果周六要工作就推迟到明天

  every: Sat
  delay_if: workday   # delay_if: [sunday, a_week, a_month]   也可以指定多个

内置可用的条件

__ 开头,因此建议用户添加 tag 时不要以两个下划线开头,可能会因为和内置条件重复导致非预期行为

查看其他任务的状况,目前支持: - __tag_is_del ,任务要被删除会触发 - __tag_is_off ,只要任务是关闭的状态就会触发 - __tag_is_on ,只要任务是开启的状态就会触发 - __tag_is_delay ,只要任务处于被延迟的状态就会触发

使用时要把 tag 换成实际的值,如下:

- desc: 执行一次后删除任务
  on: 8-6
  tag: one_time
- desc: 又一个单次任务
  if: __one_time_is_del

这样每次 tag 为 one_time 的计划被删后,都会有一句提醒的话。如果有多个计划都有 one_time 这个 tag,则任意一个被删除就会触发提醒。

计划的关启和删除

关闭和开启计划

手动添加 off: true 就是关闭,没有 off 或者改为 off: false 就是开启

  off: true

自动开启计划

如果满足条件,会把 off 改为 false,也就是开启计划,并在这次就判断计划是否被触发,而不是等下一次推理时再判断。

  off: true
  start_if: one_tag_example

自动关闭计划

  off: false
  stop_if: one_tag_example

在 start_if 和 stop_if 后除了可以跟 tag ,还可以跟日期。比如

9月3号后开启任务

  off: true
  start_if: 9-3

1、5号开启任务,3、7号关闭任务

  off: true
  start_if: [1, 5]
  stop_if: [3, 7]

计划休眠若干次

当任务被触发时,休眠 3 次,也就是前 3 次虽然被触发,但是不会做任何事情,第 4 次恢复。若计划本身就已经关闭,那么无法被触发,也就不会休眠,这是和关闭计划的不同之处。

  sleep: 3

删除计划

除了手动删除,还可以满足一定条件后自动删除。

触发若干次数后,自动删除

  max_count: 3  # max_count 只能跟次数

触发条件后,自动删除,不过计划若在这次被触发依然会输出

  del_if: one_tag_example

计划内容

desc 放任务的描述。

  desc: 任务内容

使用变量

内置变量有这些: - 今年的年份 {{year}},今年第几周 {{week_of_year}},今天星期几 {{weekday_zh}} - 今日的任务,{{ todo_and_notice }},一般用在一个邮件计划中,每天发邮件给自己 - 更多变量请到这里查看: https://plantodo.app/zh/context/

  desc: 今年年份用{{year}},今年第几周{{week_of_year-1}},今天{{weekday_zh}}

假设输出的那天是 2024.01.31 号,是第 5 周的星期三,则实际的输出为“今年年份用2024,今年第几周4,今天星期三”

可以使用 at 变量,查看当前任务的执行日期和时间,或者 at_time 只查看时间

队列模式

如果 desc 是列表,默认是队列模式。每次计划被触发后,会从上往下,输出第一条内容,并删除这条。

- desc:
  - 计划1
  - 计划2
  - 计划3
  - 为空时就没有内容输出

适合每隔一段时间,就需要添加内容的情况。

比如,想要每天听英语,可以在周末把下一周要听的 YouTube 视频网址,一条条地放入,这样每一天都会输出不同的网址。

轮询模式

有 index 字段则为轮询模式。

每次被触发,按顺序输出内容,如第一天输出第一条,第二天输出第二条。达到最后一条,就重新从第一条开始。

index 后跟一个正整数,代表这次要输出某一条,1 表示指向第一条。

- desc:
  - 计划1
  - 计划2
  - 计划3
  index: 1

适合一系列不同的任务依次循环,如:第一天看编程,第二天 Linux,第三天电子电路。

样式

自定义分隔符

添加一个 separator 字段,后面跟单个字符或字符串,在输出的任务描述中,这个字符串会取代默认的逗号,放在这条任务与下条任务之间

- desc: 任务内容
  every: day
  style:
    separator: k
- desc: 下条任务
  every: day

输出为“任务内容k下条任务”

特殊的,\n 代表换行符。

计划预计耗时

如计划每天看英文视频 30min,那么可以添加 time_taken: 30min,作用有两点: 1. 在今天任务汇总中,对应任务后会带上这个时长 2. 在 APP 上,下一个任务的开始时间会根据这个任务耗时进行计算,方便查看一天的时间安排,如果当天任务预计耗时超过上限,方便一眼看出来,并进行调整。

- desc: 任务内容
  every: day
  time_taken: 30min

输入的时长不能超过 24 小时,格式可以为: - 32m - 1.2m - 1.2min - 1.2mins - 1.2minute - 1.2minutes - 2hours - 2hr - 2h - 2hrs - 2hour - 2h32m - 5hr34m56s - 5 hours, 34 minutes, 56 seconds - 5 hrs, 34 mins, 56 secs

  • 4:13
  • 4:13:02
  • 4:13:02.266

该项目前只对 to myself 的计划有实际效果,对 to machine 的计划无用,原因是 to machine 无论是触发 webhook 还是发邮件等,增加花费时间没有实际意义。

指定具体执行时间

指定执行时间需要增加一个 at 字段,后面跟 hh:mm:ss 这种格式(严格两位),24 小时制,如 06:30:00,14:01:00 。

每天的 8 点半吃药

- desc: 吃药
  every: day
  at: 08:30:00

at 后面也可以跟一些表示时刻的词汇,比如破晓时刻 dawn 、日出时刻 sunrise 、日落时刻 sunset 、入夜时刻 dusk。

还可以使用加法或减法,不过只能有两个操作数,且左边的必须是词汇,右边的必须是一个时长,如“睡觉的时间在天亮前 7.5 小时”:

- desc: 入眠
  every: day
  at: tomorrow_dawn - 7h30min

没有指定具体执行时间的话,则任务的执行时间是在程序生成任务汇总的那一刻,也可以手动指定:at: once

以及,可以通过 at 指定计划的执行时刻应该在另一个计划之后,通过 after_tag 指定,tag 需要替换成具体的名称。

在 tag 对应的计划之后

  at: after_tag

如果 tag 没有对应的计划,则效果和不使用 at 等同;如果 tag 对应了多个计划(被触发的),对于 after 会放到最后一个后面。

目前,使用了 after_tag 的计划,必须放在最后才能生效,这点将来会进行改进。