Emacs 如何使用自定义TODO关键字顺序应用组织排序条目?

Emacs 如何使用自定义TODO关键字顺序应用组织排序条目?,emacs,org-mode,Emacs,Org Mode,更具体地说,我想使用不同的关键字顺序,而不是用于在todo状态之间切换的顺序 我知道我可以使用组织排序条目nil?O(或O)按todo关键字进行排序,这几乎满足了我的需要。但是,我想使用不同的关键字排序。我在org todo keywords中定义的关键字顺序是我希望用于在关键字状态之间切换的顺序;但这不是我想用来排序任务的顺序。如果我通过更改组织todo关键字来解决这个问题,那么状态切换(Shift+箭头键)将无法按我所希望的方式工作。是否可以使用不同的关键字顺序进行排序和状态切换 我怀疑有一

更具体地说,我想使用不同的关键字顺序,而不是用于在todo状态之间切换的顺序

我知道我可以使用
组织排序条目nil?O
(或
O
)按todo关键字进行排序,这几乎满足了我的需要。但是,我想使用不同的关键字排序。我在
org todo keywords
中定义的关键字顺序是我希望用于在关键字状态之间切换的顺序;但这不是我想用来排序任务的顺序。如果我通过更改
组织todo关键字来解决这个问题,那么状态切换(Shift+箭头键)将无法按我所希望的方式工作。是否可以使用不同的关键字顺序进行排序和状态切换

我怀疑有一种方法可以使用
org sort entries
GETKEY-FUNC
COMPARE-FUNC
参数来实现这一点,尽管我对elisp的了解还不够透彻,无法一笔勾销。有什么更简单的方法吗?只需
?o
就可以了吗

另外,如果列表中的标题根本没有todo关键字,我希望能够指定它们的排序顺序。例如,我可能希望我的顺序是(无关键字)、“开始”、“待办事项”、“完成”,这样我就可以得到这样的排序行:

* 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)
  )
在这里,
(nth2(组织标题组件)
正在检索项目的TODO关键字(可能有更好的方法吗?),而
cl position
正在硬编码列表中查找其索引,以便我们按照指定的顺序按关键字排序

编辑:我还发现我有一个bug,如果我的一个项目还没有任务,那么整个
组织映射条目
调用都会部分失败,因为
组织排序条目
会抛出一个“无需排序”的错误错误。我更希望如果我们尝试对空列表进行排序,我们只返回一个空列表,而不是停止!我对此非常陌生,因此可能有更好的方法,但我通过将整个内容包装在一个
条件案例中来捕获错误,如下所示:

(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"))
  )

我很好奇为什么有人编辑了我的问题,删除了
elisp
标记-该标记有什么问题?