Organisationsdatum aus der Tabelle

7

Ich kann Daten folgendermaßen berechnen:

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
#+TBLFM: $4=$2+$3;D

aber was ich dann tun möchte, ist, dieses Datum als Tagesordnungsdatum erscheinen zu lassen, so etwas wie:

DEADLINE: $remote(mytbl,@1$4)

aber das funktioniert nicht. Ich kann keine Syntax finden, auch kein Makro, das alles andere als ein wörtliches Datum für einen Tagesordnungseintrag zulässt.

Irgendwelche Ideen?

jtgd
quelle
Es gibt eine Überlagerungsfunktion, mit der der Zeitstempel anders aussieht als er wirklich ist. Es wäre wahrscheinlich am einfachsten, diese Funktionalität zu optimieren und Ihr eigenes Format zu überlagern - unter dem Overlay befindet sich der Standard-Zeitstempel, der von zahlreichen Funktionen verwendet wird org-modeund (meiner Meinung nach) nicht einfach geändert werden kann - es gibt sogar einen Beachten Sie in der Dokumentzeichenfolge die Zeitstempelvariable, die davon abrät, sie zu optimieren.
Lawlist
org-time-stamp-formatsist eine Variable definiert in org.el. Sein Wert ist ("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")Diese Variable kann riskant sein, wenn sie als dateilokale Variable verwendet wird. Dokumentation: Formate, für format-time-stringdie Zeitstempel verwendet werden. Es wird nicht empfohlen, diese Konstante zu ändern. Siehe auch das benutzerdefinierte Zeitstempelformat: orgmode.org/manual/Custom-time-format.html#Custom-time-format
lawlist
Ich glaube, ich habe es nicht richtig erklärt. Ich versuche nicht, das Aussehen des Zeitstempels zu ändern. Mir geht es gut mit der normalen Form <% Y-% m-% d% a>. Was ich am Ende haben möchte, ist das Äquivalent von "DEADLINE: <2015-01-13 Di>", aber anstatt es selbst einzugeben, möchte ich, dass es aus der berechneten Tabelle stammt. Gibt es eine Möglichkeit, diese Informationen zu transportieren? Oder gibt es eine andere Möglichkeit, etwas nach "DEADLINE:" bereitzustellen (wie vielleicht elisp, wo ich das Datum berechnen kann), wo es als Datum interpretiert wird?
jtgd
Ich habe keine Antwort, möchte aber einige Ideen verwerfen. Im Allgemeinen ist der Organisations-Agenda-Puffer nur ein hübsches Kopieren und Einfügen aus den rohen Organisations-Agenda-Dateien. In einem kürzlich erschienenen Thread scrolle ich rückwärts durch die org-Agenda-Dateien und halte an der Überschrift jedes Eintrags an, um den Zeitstempel so zu behandeln, als wäre es x Tage AD, um weitere Berechnungen durchzuführen (z. B. ob etwas fällig ist) heute oder überfällig). emacs.stackexchange.com/a/5700/2287 Theoretisch könnten Sie bei jeder Überschrift anhalten und Ihre Berechnungen durchführen und einen benutzerdefinierten Agenda-Puffer generieren. Das ist nicht trivial, aber interessant.
Lawlist
Nun, danke für Ihre Antwort-Gesetzesliste. Ich dachte, es müsste einen Weg geben, ein Datum in die Tagesordnung aufzunehmen, außer eine wörtliche Zeichenfolge einzugeben. Vielleicht kann ich mich mit den Funktionen befassen, die beim Generieren der Agenda verwendet werden. Ich wünschte, es gäbe so etwas wie eine 'eval'-Funktion, die die Ausgabe einer Funktion erneut scannt.
jtgd

Antworten:

4

Versuche dies:

Berechnen Sie die Frist in einem Tabellenkalkulations aka Tabelle .

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
| # | [2014-12-15 Mon] | 10 | <2014-12-25 Thu> |
#+TBLFM: $4=$2+$3;D

Erstellen Sie mit der Funktion eine neue 1x1-Tabelle, die auf die berechnete Frist aus der ersten Tabelle verweistremote(NAME-OR-ID,REF) .

#+NAME: mydeadline
| <2015-01-13 Tue> |
#+TBLFM: $1=remote(mytbl,@1$4)

Übergeben Sie die Termintabelle 1x1 als Variable über den Header :var name=value an den benannten SRC Block , z. B. den elisp- Codeblock set_deadline unten.

#+NAME: set_deadline
#+HEADER: :var the_date=mydeadline
#+HEADER: :results  raw replace output 
#+begin_src elisp
   (princ (format "DEADLINE: %s" ( car (car the_date))))
#+end_src

Bewerten Sie den SRC-Block mit C-c C-cund die Frist wird der org-mode-Datei unter einem #+RESULTS:Block hinzugefügt .

Durch Hinzufügen des :results raw Headers zum Codeblock wird die Ausgabe im Format org-mode als reguläre org-Anweisung erkannt.

#+RESULTS: set_deadline
DEADLINE: <2015-01-13 Tue>

Als zusätzlichen Bonus fördert die Verwendung eines benannten src-Blocks auch die Wiederverwendung von Code über Inline-Funktionsaufrufe.

Bewerten Sie nach wie vor jede Inline-Funktion mit C-c C-cund fügen Sie der Organisationsmodus-Datei eine neue Frist hinzu.

#+NAME: first-deadline
call_set_deadline(the_date=mydeadline)[ :results raw ]

#+RESULTS: first-deadline
DEADLINE: <2015-01-13 Tue>

#+NAME: my-other-deadline
| <2014-12-25 Thu> |
#+TBLFM: $1=remote(mytbl,@2$4)

#+NAME: second-deadline
call_set_deadline(the_date=my-other-deadline)[ :results raw ]

#+RESULTS: second-deadline
DEADLINE: <2014-12-25 Thu>

Hoffe das hat geholfen!

Hinweis: Dieser Code wurde mit den folgenden Versionen von Emacs und Org-Mode getestet.

GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)
Org-mode version 8.2.10 (8.2.10-29-g89a0ac-elpa)
Melioratus
quelle
@jtgd, hat diese Antwort geholfen?
Melioratus
Ja, sehr. Siehe unten.
Jtgd
@jtgd Danke! Du hast meinen Tag gerettet! In Bezug auf die replacenicht wie erwartet verhalten, versuchen , zu aktualisieren rawHeader mit drawerKopf. Nachdem ich gewechselt hatte, funktionierte alles wie erwartet. Hoffe das hat geholfen! Vielen Dank für Ihre Frage und Ihren Elisp-Code!
Melioratus
@jtgd - Ich habe gerade ein weiteres Beispiel veröffentlicht , das winzige Codeblöcke verwendet, die in eLisp, Perl, Bash, Python und Ruby geschrieben wurden, um Text in eine Liste von Kontrollkästchen umzuwandeln.
Melioratus
Oh, nochmals vielen Dank! Das drawerDing funktioniert jetzt perfekt. So viel über den Org-Modus zu lernen, schön, Zauberer wie Sie zu haben. Was Ihre anderen geposteten Beispiele betrifft, habe ich eines ausprobiert und es funktioniert rawohne Anhängen. Aber meine Bewerbung funktioniert und ich bin glücklich.
jtgd
1

Vielen Dank Melioratus, was für eine hervorragende Antwort! Es ist erstaunlich, wie Sie die verschiedenen Mechanismen des Org-Modus verwendet haben, um dies zu tun. Der wichtigste Teil davon war für mich, :results rawwelcher Text ausgegeben wurde, der bei der Erstellung der Agenda erneut gescannt werden sollte. Das war der Schlüssel.

Als ich mir ansah, wie ich dies erweitern könnte, um viele Daten zu verarbeiten, fragte ich mich, ob ich die Datumsberechnungen nicht einfach in elisp durchführen könnte. Ich bin noch sehr neu in Elisp, aber ich habe ein bisschen herumgehackt und mir das ausgedacht.

Meine Aufgabe besteht darin, das Datum zu berechnen, an dem meine Medikamente aufgebraucht sind, indem ich dem Tag, an dem ich mit der Flasche beginne, 30 Tage hinzufüge. Was ich getan habe war das.

In meinen .emacs habe ich einige Funktionen geschrieben:

(defun date-high-low (secs)
  "Split int into high-low words"
  (list (/ secs 65536) (% secs 65536)))

(defun date-plus-days (datestr days)
  "Generate org-style date string from date + days offset"
  (format-time-string "<%Y-%m-%d %a>" (date-high-low (truncate (+ (org-time-string-to-seconds datestr) (* days 86400))))))

(defun org-header-date-plus-days (fmt datestr days)
  "Use above to build final org header entry from format string"
  (princ (format fmt (date-plus-days datestr days))))

Ich habe versucht, diese Funktionen generisch zu halten und mich nicht auf die Medikamente zur Wiederverwendbarkeit zu konzentrieren. Es könnte bessere Möglichkeiten geben, dies zu tun, wie ich sagte, ich bin ein Neuling.

Dann mache ich in meiner .org-Datei Folgendes:

#+HEADER: :results raw output replace
#+begin_src elisp
    (org-header-date-plus-days "** MED LAST DAY Med-1\nDEADLINE: %s\n" "[2014-12-14 Sun]" 30)
    (org-header-date-plus-days "** MED LAST DAY Med-2\nDEADLINE: %s\n" "[2014-12-22 Mon]" 54)
    (org-header-date-plus-days "** MED LAST DAY Med-3\nDEADLINE: %s\n" "[2015-01-02 Fri]" 60)
#+end_src

Schön und ordentlich, eine Zeile pro Instanz. Wenn Sie Cc Cc für den Block ausführen, werden die Überschrift und die FRIST mit Datum generiert und es wird perfekt in der Agenda angezeigt. Es funktioniert gut und ich bin mit den Ergebnissen zufrieden. Nochmals vielen Dank für den Tipp an Sie und Lawlist.

ps Das einzige, was nicht funktioniert, ist das replace. Es wird immer an den Block # + RESULTS angehängt, daher muss ich ihn löschen, bevor ich ihn generieren kann. Es ist geringfügig, aber ich verstehe nicht warum.

jtgd
quelle