Hóa ra đó %(expression)
không phải là một hàm được truyền bất kỳ đối số nào, nhưng hàm (point)
này được đặt thành tiêu đề hiện tại khi nó được xử lý, vì vậy bạn có thể viết một cái gì đó như:
(org-agenda-prefix-format " %e %(or (org-entry-get (point) "Effort") "0:00") ")
... Và những nỗ lực được báo cáo nên đồng ý với %e
.
Bây giờ, org-entry-get
không hỗ trợ tìm kiếm lên hệ thống phân cấp nếu tài sản không được thiết lập vào mục hiện tại, nhưng những gì cần thiết là thu thập tất cả các thuộc tính xuống hệ thống phân cấp, vì vậy chúng ta có thể tổng hợp các nỗ lực.
Đây là lần đầu tiên:
(defun my-org-entry-get-subtree (property)
(save-excursion
(save-restriction
(org-narrow-to-subtree)
(goto-char (point-max))
(save-match-data
(cl-loop while (re-search-backward org-heading-regexp nil t)
collect (org-entry-get (point) property))))))
Mà có thể được sử dụng để tổng hợp những nỗ lực:
(defun my-org-effort-sum-current-item ()
(org-minutes-to-hh:mm-string
(cl-loop for minutes in (my-org-entry-get-subtree "Effort")
sum (org-hh:mm-string-to-minutes (or minutes "0:00")))))
Vấn đề: nếu bạn có một TODO với 3 TODO phụ mỗi lần với một giờ nỗ lực và bạn hoàn thành một TODO phụ, tổng nỗ lực còn lại là 2 giờ. Nhưng đoạn mã trên bao gồm nỗ lực từ vật phẩm ở trạng thái DONE, ghi sai 3 giờ.
Chúng tôi phải chỉ khớp các mục trong cây con ở trạng thái TODO:
(defun my-org-effort-sum-current-item-in-state (state)
(org-minutes-to-hh:mm-string
(cl-loop for minutes in (my-org-entry-subtree-in-state-get state "Effort")
sum (org-hh:mm-string-to-minutes (or minutes "0:00")))))
(defun my-org-entry-subtree-in-state-get (state property)
(save-excursion
(save-restriction
(org-narrow-to-subtree)
(goto-char (point-max))
(save-match-data
(cl-loop while (re-search-backward org-heading-regexp nil t)
when (string-equal state (org-get-todo-state))
collect (org-entry-get (point) property))))))
Thêm phần này vào org-agenda-prefix-format
:
(setq org-agenda-custom-commands
'(("c" "My TODOs"
((tags-todo "mytag"
((org-agenda-prefix-format "[%(my-org-effort-sum-current-item-in-state "TODO")] ")
(org-tags-match-list-sublevels t)))))))
... Và bạn kết thúc với một cái gì đó như thế này:
Projects
[3:00] TODO Some Project Task
[1:00] TODO Sub-task A
[1:00] TODO Sub-task B
[1:00] TODO Sub-task C
(xem câu hỏi khác này để biết cách thực hiện các tác vụ phụ)