¿Cómo hacer que la organización solicite una marca de tiempo cuando se cambia el estado de un TODO?

7

Tengo tantas tareas que hago lejos de mi computadora con emacs. Ahora, cuando cambio el estado de un TODO, solo registra la hora actual en el cajón. Pero la diferencia con el tiempo real del evento puede ser de muchas horas, si no días.

¿Hay alguna manera de hacer que se solicite una marca de tiempo que me gustaría que registre?

koddo
fuente

Respuestas:

6

Hace un tiempo que quería exactamente el mismo comportamiento de "Hice esto ayer" y nunca pude intentar implementarlo. Pero ahora si puedo obtener puntos por ello ...

Este comportamiento parece estar codificado org-todo. La línea org.elque establece la marca de tiempo CERRADA es (org-add-planning-info 'closed (org-current-effective-time))y se agregan las notas de LOGBOOK org-add-log-setup, que a su vez llama org-effective-current-time. org-effective-current-timehace lo que parece y devuelve el tiempo efectivo.

La solución obvia es cambiar temporalmente org-effective-current-timea algo que solicite una cita. Pero luego se nos solicita la fecha varias veces con cada llamada, lo cual es molesto. No conozco una buena manera de evitarlo, pero puede guardar el valor introducido por el usuario y mantenerlo hasta el final de la función.

Este código parece funcionar y solo aparece una vez cuando se registra un cambio de estado.

(defun org-todo-with-date (&optional arg)
  (interactive "P")
  (cl-letf* ((org-read-date-prefer-future nil)
             (my-current-time (org-read-date t t nil "when:" nil nil nil))
            ((symbol-function #'org-current-effective-time)
             #'(lambda () my-current-time)))
    (org-todo arg)
    )) 
erikstokes
fuente
Muchas gracias. Refactoré tu código un poco. No dude en pegar esto en su respuesta: gist.github.com/koddo/aa6d497e0d1df4023915
koddo
1
Parece que la próxima aparición de una tarea repetida (p .+7d. Ej. ) No se programaría correctamente con esta función (se programa como si la tarea se hubiera completado hoy).
xji
@xji También me ha molestado ese comportamiento, pero no tengo una solución. Este tipo de hacks son bastante frágiles.
erikstokes
@erikstokes Sí, ahora estoy pensando en abandonar el modo org como la herramienta para administrar tareas / hábitos recurrentes. Algunas aplicaciones móviles lo hacen mejor. Trataré de usarlo solo para producir una lista de tareas únicas con prioridad adjunta, revisarlas todos los días y ponerles marcas de tiempo para programar mi agenda diaria.
xji
2

Puede superponer más hacks en la primera respuesta para abordar el problema con la programación de repetidores que no se actualizan correctamente. Tenga en cuenta que si LAST_REPEATse establece, se establecerá en la fecha real, no la elegida. Deseo que Org agregue esto como una característica de primera clase; la fecha real se filtra org-todoen muchos lugares; Estoy seguro de que esta respuesta todavía echa de menos:

    (defun org-todo-with-date (&optional arg)
      (interactive "P")
      (cl-letf* ((org-read-date-prefer-future nil)
                 (my-current-time (org-read-date t t nil "when:" nil nil nil))
                 ((symbol-function #'current-time)
                  #'(lambda () my-current-time))
                 ((symbol-function #'org-today)
                  #'(lambda () (time-to-days my-current-time)))
                 ((symbol-function #'org-current-effective-time)
                  #'(lambda () my-current-time)))
        (org-todo arg)))
Alex
fuente
0

Y aquí hay otra capa para arreglar el caso LAST_REPEAT:

(defun org-todo-with-date (&optional arg)
  (interactive "P")
  (cl-letf* ((org-read-date-prefer-future nil)
             (my-current-time (org-read-date t t nil "when:" nil nil nil))
             ((symbol-function 'current-time)
              #'(lambda () my-current-time))
             ((symbol-function 'org-today)
              #'(lambda () (time-to-days my-current-time)))
             ((symbol-function 'org-current-effective-time)
              #'(lambda () my-current-time))
             (super (symbol-function 'format-time-string))
             ((symbol-function 'format-time-string)
              #'(lambda (fmt &optional time time-zone)
                  (funcall super fmt my-current-time time-zone))))
    (org-todo arg)))

esperemos que format-time-stringsólo llamado desde org-auto-repeat-maybeen el org-todocontexto y sólo para LAST_REPEATla inserción.

De todos modos, siempre puede copiar el org-tododefun en su archivo de inicio emacs.el y modificarlo allí en lugar de las funciones de selección de cereza con cl-letf(aunque es genial hacerlo)

Nosferatu
fuente