从组织子树创建组织时钟任务

时间:2018-03-09 17:34:48

标签: emacs org-mode

我在org-file

中有以下表单的任务列表
change['Property.PropertyName'] which is undefined

并希望在SELECT created, sum(shipping), sum(price) from ( SELECT o.created, o.shipping, sum(i.price) as price FROM test_order o, test_item i WHERE i.order_id = o.id group by o.created, o.id) subquery; 下创建可以轻松计时的子任务(例如。* Tasks ** task 1 ** task 2 * Tasks等弹出窗口,当调用 Cu {{ 1}}。我正在考虑使用task 1来构建任务列表但是没有通过一种简单的方式来遍历org-mode头树来创建任务?我在看{ {3}}链接,但希望有一个替代/组织API可以实现这一目标。

我也有兴趣在task 2 {{}}}之间保存时钟历史记录而不加载org-clock-in,因为我尝试将org-clock-history-pushdestop-sessions添加到org-mode没有工作。

1 个答案:

答案 0 :(得分:0)

最后,我从链接的帖子中获得了灵感。这段代码将创建并向org-clock-history添加非“完成”的任务,因此可以通过 C-u org-clock-in轻松访问这些任务。

(defun my-org-header-list (&optional header-re level buffer items)
  "Get the headers of an org buffer (default current buffer). Optionally,
narrows to headers matching HEADER-RE under nesting LEVEL (defaults all
headers). Returns plist list of headers with specified values in ITEMS when defined.
Defaults to header text, location, level, todo status. 
See `org-element-all-elements' for possible item types."
  (setq level (or level 0)) ;default all headers
  (save-restriction
    (with-current-buffer (or buffer (current-buffer))
      (goto-char (point-min))
      (and header-re
           (re-search-forward header-re nil nil 1)
           (org-narrow-to-element))
      (let ((tree (org-element-parse-buffer 'headline)))
        (list :buffer (current-buffer)
              :headers
              (org-element-map tree 'headline
                (lambda (el)
                  (when (< level (org-element-property :level el))
                    (or (and items
                             (cl-loop for sym in items
                                nconc (list sym (org-element-property sym el))))
                        (list :raw-value (org-element-property :raw-value el) ;text
                              :begin (org-element-property :begin el) ;start
                              :end (org-element-property :end el)     ;end
                              :level (org-element-property :level el) ;depth
                              :todo-keyword (org-element-property :todo-keyword el))
                        )))))))))


;; construct list of tasks to choose from in clock history buffer
;; #<marker at 19296 in org-clock.el>
(defun my-org-clock-create (headers)
  "Create clock tasks for headers."
  (let ((buf (plist-get headers :buffer)))
    (cl-loop for h in (plist-get headers :headers)
       when (not (string= "DONE" (plist-get h :todo-keyword)))
       do (org-clock-history-push (plist-get h :begin) buf))))

;; generate a list of TODO tasks nested under Tasks heading from 
;; BUFFER-NAME
;;;###autoload
(defun my-org-clock-in (arg &optional buffer-name)
  (interactive "P")
  (my-org-clock-create
   (my-org-header-list
    (if arg (read-string "Task group: ") "Tasks") 1 (or buffer-name "gtd.org")
        '(:raw-value :begin :todo-keyword))))