Wie kann eine Organisation zur Eingabe eines Zeitstempels aufgefordert werden, wenn der Status eines TODO geändert wird?

7

Ich habe so viele Aufgaben, die ich mit Emacs weit weg von meinem Computer erledige. Wenn ich jetzt den Status eines TODO ändere, wird nur die aktuelle Zeit in der Schublade protokolliert. Der Unterschied zur tatsächlichen Zeit des Ereignisses kann jedoch viele Stunden, wenn nicht Tage betragen.

Gibt es eine Möglichkeit, die Eingabe eines Zeitstempels zu veranlassen, den ich protokollieren möchte?

Koddo
quelle

Antworten:

6

Ich wollte für eine Weile genau das gleiche Verhalten wie "Ich habe das gestern gemacht" und bin nie dazu gekommen, es zu implementieren. Aber jetzt, wenn ich Punkte dafür bekommen kann ...

Dieses Verhalten scheint fest codiert zu sein org-todo. Die Zeile, in org.elder der GESCHLOSSENE Zeitstempel festgelegt wird, ist (org-add-planning-info 'closed (org-current-effective-time))und die LOGBOOK-Notizen werden von hinzugefügt org-add-log-setup, was wiederum aufruft org-effective-current-time. org-effective-current-timemacht, wie es sich anhört und gibt die effektive Zeit zurück.

Die naheliegende Lösung besteht darin, vorübergehend org-effective-current-timezu etwas zu wechseln , das zur Eingabe eines Datums auffordert. Aber dann werden wir bei jedem Anruf mehrmals nach dem Datum gefragt, was ärgerlich ist. Ich kenne keinen guten Weg, um dies zu vermeiden, aber Sie können einfach den vom Benutzer eingegebenen Wert speichern und diesen bis zum Ende der Funktion beibehalten.

Dieser Code scheint zu funktionieren und fordert nur einmal auf, wenn eine Statusänderung protokolliert wird.

(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
quelle
Vielen Dank. Ich habe Ihren Code ein wenig überarbeitet. Bitte zögern
koddo
1
Scheint, dass das nächste Auftreten einer wiederholten Aufgabe (z. B. .+7d) mit dieser Funktion nicht korrekt geplant wurde (es ist so geplant, als ob die Aufgabe heute beendet wäre).
Xji
@xji Ich habe mich auch über dieses Verhalten geärgert, habe aber keine Lösung. Diese Arten von Hacks sind alle ziemlich zerbrechlich.
Erikstokes
@erikstokes Ja, jetzt denke ich darüber nach, den Organisationsmodus als Werkzeug zur Verwaltung wiederkehrender Aufgaben / Gewohnheiten aufzugeben. Einige mobile Apps machen es besser. Ich werde versuchen, es nur zu verwenden, um eine Liste von einmaligen Aufgaben mit Priorität zu erstellen, sie jeden Tag zu überprüfen und Zeitstempel auf sie zu setzen, um meine tägliche Agenda zu planen.
Xji
2

Sie können mehr Hacks über die erste Antwort legen, um das Problem zu beheben, dass Repeater nicht korrekt aktualisiert werden. Beachten Sie, dass wenn LAST_REPEATfestgelegt, das tatsächliche Datum und nicht das ausgewählte Datum festgelegt wird. Ich wünschte, Org würde dies als erstklassiges Feature hinzufügen. das tatsächliche Datum tritt org-todoan vielen Stellen ein; Ich bin sicher, diese Antwort vermisst noch einige:

    (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
quelle
0

Und hier ist eine weitere Ebene, um den LAST_REPEAT-Fall zu beheben:

(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)))

hoffentlich format-time-stringwird nur org-auto-repeat-maybeim org-todoKontext aufgerufen und nur zum LAST_REPEATEinfügen.

Auf org-todojeden Fall können Sie den Defun jederzeit in Ihre emacs.el-Init-Datei kopieren und dort ändern, anstatt Funktionen zum Auswählen von Kirschen zu verwenden cl-letf(obwohl es irgendwie cool ist, dies zu tun).

Nosferatu
quelle