org-mode – Sumar propiedades a través de subtítulos (modo Org)

Pregunta:

Supongamos que nuestro cursor / apunte se encuentra en la primera línea de Parent Task en lo siguiente:

* Parent Task
:PROPERTIES:
:END:

** Sub-Task A
:PROPERTIES:
:TALLY: 2
:END:

** Sub-Task B
:PROPERTIES:
:TALLY: 8
:END:

Pregunta: ¿Hay alguna manera de escribir una función que (i) sume las :TALLY la :TALLY_SUM Sub-Task A y la :TALLY_SUM Sub-Task B y (ii) las inserte en la propiedad :TALLY_SUM de la Parent Task ?

Sé que para la parte (ii) podemos usar la función API de propiedad del modo (org-entry-put "TALLY_SUM" <sum>) .

Respuesta:

La siguiente función debería hacer el trabajo:

(defun org-sum-tally-in-subtree ()
  "Add up all the TALLY properties of headings underneath the current one
The total is written to the TALLY_SUM property of this heading"
  (interactive)
  (org-entry-put (point) "TALLY_SUM"
                 (number-to-string 
                  (let ((total 0))
                    (save-excursion
                      (org-map-tree
                       (lambda ()
                         (let ((n (org-entry-get (point) "TALLY")))
                           (when (stringp n)
                             (setq total (+ total (string-to-number n))))))))
                    total))))

Dos puntos a tener en cuenta:

  1. Se buscan todos los subtítulos debajo del punto actual, no solo el siguiente nivel hacia abajo
  2. El código no TALLY que TALLY sea ​​un número entero, por lo que también funciona para valores flotantes.

Ejemplo:

** Parent Task
:PROPERTIES:
:TALLY_SUM: 22.201
:END:

Do =M-x org-sum-tally-in-subtree= here

*** Sub-Task A
:PROPERTIES:
:TALLY: 4
:END:

**** Sub-sub task
:PROPERTIES:
:TALLY:    10.001
:END:

*** Sub-Task B
:PROPERTIES:
:TALLY: 8.2
:END:

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım