如何解决如何使用自定义TODO关键字顺序应用org-sort-entries?
更具体地说,我想使用与在待办状态之间切换的顺序不同的关键字顺序。
我知道我可以使用org-sort-entries nil ?O
(或?o
)对todo关键字进行排序,这几乎可以得到我想要的东西。但是,我想使用其他关键字排序。我在org-todo-keywords
中定义的关键字顺序是我想在关键字状态之间进行切换的顺序;但这不是我要用来排序任务的顺序。如果我通过更改org-todo-keywords
来解决此问题,则状态切换(Shift +箭头键)将无法按照我想要的方式工作。是否可以使用其他关键字顺序进行排序与状态切换?
我怀疑有一种使用org-sort-entries
'GETKEY-FUNC
和COMPARE-FUNC
参数的方法,尽管我不十分了解elisp才能把它写在脑海里。有没有更简单的方法-仅凭?o
就能做到吗?
作为奖励,如果列表中的标题根本没有NO todo关键字,我希望能够指定它们按排序顺序所处的位置。例如,我可能希望我的订单为(无关键字),“ STARTED”,“ TODO”,“ DONE”,以便最终得到这样的排序行:
* Project A
** Reference for this project: projectA-url.com
** STARTED Write the docs
** STARTED Build the second bit
** TODO Build the third bit
** DONE Set up the infrastructure
** DONE Build the first bit
解决方法
最后,我找不到使用?o
的任何方法。如果有人可以提出解决办法,那将是对我的问题的更好答案。
我确实使用?f
和GETKEY-FUNC
实现了这一点。看起来像:
(defun todosort-key-func ()
(cl-position
(nth 2 (org-heading-components))
'(nil "STARTED" "TODO" "DONE")
:test 'equal
)
)
(org-map-entries
'(org-sort-entries nil ?f 'todosort-key-func)
"LEVEL=1" 'file)
)
这里(nth 2 (org-heading-components)
正在检索该项目的TODO关键字(可能有更好的方法吗?),而cl-position
在硬编码列表中找到其索引,因此我们按指定顺序按关键字排序。
编辑:我还发现我有一个错误,如果我的一个项目还没有任务,则整个org-map-entries
调用会部分失败,因为org-sort-entries
会抛出“ Nothing to排序”错误。我希望如果我们尝试对一个空列表进行排序,我们只是返回一个空列表,而不是停止!我对此很陌生,因此可能有更好的方法,但是我通过将整个内容包装在condition-case
中来捕获错误来解决此问题,例如:
(condition-case nil
(org-map-entries
'(org-sort-entries nil ?f 'todosort-key-func)
"LEVEL=1" 'file)
)
(user-error (message "user-error,probably empty sort list,continuing"))
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。