我正在寻找一种方法来匹配我称之为“注释”的内容,这是组织任务的最后一行(或一组行),上面写着:“These are the notes of the task.
”
我已经编写了一个真正的长正则表达式,可以完成这项工作,但我希望org-mode已经提供了更好的东西:
"^\\(\\*\\*\\)\\(?: +\\(Active\\|Next Action\\|Hold\\|Reference\\|Delegated\\|Postponed\\|Waiting\\|Someday\\|Planning\\|Canceled\\|None\\)\\)?\\(?: +\\(\\[#.\\]\\)\\)?\\(?: +\\(.*?\\)\\)??\\(?:[ ]+\\(:[[:alnum:]_@#%:]+:\\)\\)?[ ]*\\(?:\\(\n\\)\\)?\\(?: +\\(DEADLINE:\\|SCHEDULED:\\)\\)?\\(?: +\\(<\\)\\([^>]+\\)\\(>\\)\\)?\\(?: +\\(DEADLINE:\\|SCHEDULED:\\)\\)?\\(?: +\\(<\\)\\([^>]+\\)\\(>\\)\\)?\\(?:\\(\n\\)\\)?\\(?: +\\(CLOSED:.*\\)\\)?\\(?:\\(\n\\)\\)?\\(?: +\\(:PROPERTIES:\\)\\)?\\(?:\\(\n\\)\\)?\\(?: +\\(:ToodledoID:\\)\\)?\\(?: +\\([0-9]+\\)\\)?\\(?:\\(\n\\)\\)?\\(?: +\\(:ToodledoFolder:\\)\\)?\\(?: +\\(EVENTS\\|TASKS\\|UNDATED\\|DONE\\|CONTACT\\)\\)?\\(?:\\(\n\\)\\)\\(?: +\\(:Hash:\\)\\)?\\(?: +\\(.*+\\)\\)?\\(?:\\(\n\\)\\)?\\(?: +\\(:END:\\)\\)?\\(?:\\(\n\\)\\)?\\(.*\\(?:\n.*\\)*?\\)\\(?:^\\)"
** Delegated [#A] 0 @ Title of the task. :event:lawlist:
DEADLINE: <2014-01-11 Sat 08:00> SCHEDULED: <2014-01-11 Sat>
:PROPERTIES:
:ToodledoID: 353081871
:ToodledoFolder: EVENTS
:Hash: 20657e7586fcc67da708789d7bbc0fbd
:END:
These are the notes of the task.
解析我发现的组织任务的最完整示例使用org-element-parse-buffer
,但我仍然看不到仅提取注释的关键:https://github.com/yyr/org-mode/blob/master/testing/lisp/test-org-element.el
如果可能,我想要类似于虚构代码(org-element-property :notes (org-element-at-point))
的内容,不需要缩小到子树以提取注释。我有几百个任务,我正在寻找一种方法来快速梳理主组织文件,并创建我自己的自定义议程缓冲区,显示第一个和也许第二行(如果截止日期或已安排)和结尾处的注释(如果存在)。我有一种感觉,如果我必须缩小到200个任务的子树,那么产生最终显示将会有很大的延迟。
任务的前两行已经用这个来处理:
(defvar lawlist-org-heading-regexp
"^\\(\\*+\\)\\(?: +\\(.*?\\)\\)?[ \t]*\\(\n.*DEADLINE.*$\\)"
"Custom match org headline, plus the second line with a deadline.")
(setq txt
(save-excursion
(org-back-to-heading t)
(when (looking-at org-heading-regexp)
(concat
(match-string 1)
" "
(match-string 2)
(if (and (looking-at lawlist-org-heading-regexp) (match-string 3))
(match-string 3))
"\n" )))) )
(message "%s" (org-element-map (org-element-parse-buffer) 'paragraph 'identity nil t))
给了我以下内容:
(paragraph
(:begin 244
:end 276
:contents-begin 244
:contents-end 276
:post-blank 0
:post-affiliated 244
:parent (section
(:begin 58
:end 276
:contents-begin 58
:contents-end 276
:post-blank 0
:parent (headline
(:raw-value 0
@
Title of the task.
:begin 1
:end 276
:pre-blank 0
:hiddenp nil
:contents-begin 58
:contents-end 276
:level 2
:priority 65
:tags (event lawlist)
:todo-keyword Delegated
:todo-type todo
:post-blank 0
:footnote-section-p nil
:archivedp nil
:commentedp nil
:quotedp nil
:deadline (timestamp
(:type active
:raw-value <2014-01-11 Sat 08:00>
:year-start 2014
:month-start 1
:day-start 11
:hour-start 8
:minute-start 0
:year-end 2014
:month-end 1
:day-end 11
:hour-end 8
:minute-end 0
:begin 71
:end 95
:post-blank 2))
:scheduled (timestamp
(:type active
:raw-value <2014-01-11 Sat>
:year-start 2014
:month-start 1
:day-start 11
:hour-start nil
:minute-start nil
:year-end 2014
:month-end 1
:day-end 11
:hour-end nil
:minute-end nil
:begin 106
:end 122
:post-blank 0))
:TOODLEDOID 353081871
:TOODLEDOFOLDER EVENTS
:HASH 20657e7586fcc67da708789d7bbc0fbd
:CATEGORY .scratch
:title (0 @ Title of the task.)
:parent (org-data nil #4)) #2))
(planning (:closed nil
:deadline (timestamp
(:type active
:raw-value <2014-01-11 Sat 08:00>
:year-start 2014
:month-start 1
:day-start 11
:hour-start 8
:minute-start 0
:year-end 2014
:month-end 1
:day-end 11
:hour-end 8
:minute-end 0
:begin 71
:end 95
:post-blank 2))
:scheduled (timestamp
(:type active
:raw-value <2014-01-11 Sat>
:year-start 2014
:month-start 1
:day-start 11
:hour-start nil
:minute-start nil
:year-end 2014
:month-end 1
:day-end 11
:hour-end nil
:minute-end nil
:begin 106
:end 122
:post-blank 0))
:begin 58
:end 123
:post-blank 0
:parent #2))
(property-drawer (:begin 123
:end 244
:hiddenp nil
:contents-begin 139
:contents-end 235
:post-blank 0
:post-affiliated 123
:parent #2)
(node-property (:key ToodledoID
:value 353081871
:begin 139
:end 165
:post-blank 0
:parent #3))
(node-property (:key ToodledoFolder
:value EVENTS
:begin 165
:end 192
:post-blank 0
:parent #3))
(node-property (:key Hash
:value 20657e7586fcc67da708789d7bbc0fbd
:begin 192
:end 235
:post-blank 0
:parent #3)))
#0))
These are the notes of the task.)
答案 0 :(得分:2)
编辑(2014年1月7日):第一份工作草案。正则表达式的尾端将匹配音符,直到下一个空行 - 即,音符可能是几行,返回硬,并且它们之间没有空行。
编辑(2014年1月14日):修改了31和32,以便在缓冲区末尾不需要最后的新行 - 即,在结尾处没有注释的任务缓冲区现在已被识别。修改了20到24,以便:ToodledoID:
抽屉和:ToodledoFolder:
抽屉的位置可以互换。修订后的示例get-whopper
可以排除32。
编辑(2014年11月14日):更新了regexp,但功能保持不变。
编辑(2014年12月2日):删除自定义功能并替换为库存org-back-to-heading
。
编辑(2014年12月6日:正则表达式的重大改进。正则表达式现在支持大多数条目的可选项,并且缓冲区末尾不需要最后的新行。在新版本中,正则表达式可以在自定义*Org Agenda*
缓冲区中使用,该缓冲区仅显示原始待办事项中的部分项目 - 例如,标题+截止日期/预定/已关闭+注释;或仅标题+注释。{{然而,1}}是一个强制锚 - 即,正则表达式需要至少一(1)个标记才能正常工作。行结尾 - 即:tag:
- 不再编号匹配条目。正则表达式现在支持聚集在一起的todo条目,而没有任何新行分隔它们。请参阅有关非捕获组的相关线程:https://stackoverflow.com/a/3513858/2112489另请参阅有关多行正则表达式emacs的相关线程:http://www.emacswiki.org/emacs/MultilineRegexp
\n