如何将当前Org-mode缓冲区中所有任务的优先级统一降级?
批量降级Org-mode缓冲区所有任务优先级的方法
问题背景
需要调整大型Org-mode文件中所有现有任务的优先级,以便新增更高优先级任务。已知(org-priority-down)可单条降级,但不清楚如何批量/递归调用。
临时变通方案
目前使用正则替换的方式临时解决,但希望找到更符合Org-mode惯用写法的方案:
(while (re-search-forward "#D" nil t) (replace-match "#E")) (while (re-search-forward "#C" nil t) (replace-match "#D")) (while (re-search-forward "#B" nil t) (replace-match "#C")) (while (re-search-forward "#A" nil t) (replace-match "#B"))
推荐的惯用解决方案
方案1:遍历所有顶级标题(非递归)
利用save-excursion和org-next-heading遍历缓冲区所有顶级标题,对带优先级的任务执行降级:
(defun org-batch-lower-priorities () "批量降低当前Org缓冲区中所有顶级任务的优先级" (interactive) (save-excursion (goto-char (point-min)) (while (org-next-heading) (when (org-get-priority) (org-priority-down)))))
使用方式:在目标Org缓冲区中执行M-x org-batch-lower-priorities。
方案2:递归遍历所有层级任务
如果需要处理包括子任务在内的所有层级条目,使用Org-mode内置的递归遍历工具org-map-entries:
(defun org-recursive-lower-priorities () "递归降低当前Org缓冲区中所有任务(含子任务)的优先级" (interactive) (org-map-entries (lambda () (when (org-get-priority) (org-priority-down))) t))
参数t表示匹配所有条目,自动处理嵌套的子任务。使用方式为执行M-x org-recursive-lower-priorities。
内容的提问来源于stack exchange,提问作者Nikita Fedyashev
相关产品推荐
相关产品推荐

