A.10 Extracting Agenda Information

Org 提供可在 Emacs 批处理模式下调用的命令,用于获取日程内容。通过该命令行接口,可自动化生成日程并进行后续处理或打印。

org-batch-agenda 会以 ASCII 格式生成日程视图并输出到标准输出。该命令接受一个字符串参数。若参数为单个字符,Org 会将其作为 org-agenda-custom-commands 的按键,与日程调度器中可用的命令一致(见 The Agenda Dispatcher)。

以下命令行示例可直接将 TODO 列表发送至打印机:

emacs -batch -l ~/.emacs -eval '(org-batch-agenda "t")' | lpr

若字符串参数长度大于等于 2,Org 会将其作为标签/TODO 匹配条件。例如,以下命令行打印带有 ‘shop’ 标签、但不含 ‘NewYork’ 标签的条目:

emacs -batch -l ~/.emacs                                      \
      -eval '(org-batch-agenda "+shop-NewYork")' | lpr

动态修改参数的示例:

emacs -batch -l ~/.emacs                                      \
   -eval '(org-batch-agenda "a"                               \
           org-agenda-span (quote month)                      \
           org-agenda-include-diary nil                       \
           org-agenda-files (quote ("~/org/project.org")))'   \
   | lpr

该命令仅从 ‘~/org/projects.org’ 文件生成未来 30 天的日程。

如需结构化处理日程输出,可使用 org-batch-agenda-csv ,输出字段如下:

category

条目分类

head

标题,不含 TODO 关键字、标签和优先级

type

日程条目类型,可选值:

todo通过 TODO 匹配选中
tagsmatch通过标签匹配选中
diary从日记导入
deadline截止日期
scheduled计划时间
timestamp由时间戳选中的约会
closed在指定日期关闭的条目
upcoming-deadline截止日期临近提醒
past-scheduled顺延的计划条目
block包含对应日期块的条目
todo

TODO 关键字(如有)

tags

所有标签(含继承标签),以冒号分隔

date

相关日期,格式如 ‘2007-2-14

time

时间,格式如 ‘15:00-16:50

extra

包含额外计划信息的字符串

priority-l

优先级字母(如有)

priority-n

计算得出的数字优先级

如果议程项的筛选是基于时间戳(包括带有 ‘DEADLINE’ 和 ‘SCHEDULED’ 关键字的条目),那么 Org 会在输出中包含日期和时间。

如果议程项的筛选是基于时间戳(或截止日期 / 计划日期),那么 Org 会在输出中包含日期和时间。

以下是一个用 Perl 编写的后处理脚本示例。它读取 Emacs 输出的 CSV 内容,并以带复选框的形式打印出来:

#!/usr/bin/perl

# 定义要运行的 Emacs 命令
$cmd = "emacs -batch -l ~/.emacs -eval '(org-batch-agenda-csv \"t\")'";

# 执行命令并捕获输出
$agenda = qx{$cmd 2>/dev/null};

# 遍历所有行
foreach $line (split(/\n/,$agenda)) {
    # 拆分字段
    ($category,$head,$type,$todo,$tags,$date,$time,$extra,
     $priority_l,$priority_n) = split(/,/,$line);
    # 处理并打印
    print "[ ] $head\n";
}