Emacs: Funktion zum Erstellen einer Datei mit Datum / Uhrzeit als Dateiname und einer Verknüpfung dafür

8

Ich muss Textdateien mit dem folgenden Namensformat generieren : YYYYY-MM-DD--hh-mm-ss.org. Wie kann ich die Capture-Funktionalität dafür nutzen? Das heißt, anstatt einen Eintrag pro Erfassung in einer einzelnen Datei vorzunehmen, sollte die Funktion eine einzelne Datei pro Erfassung erstellen, und hoffentlich mit allen Möglichkeiten innerhalb des Erfassungsmechanismus.

Myotis
quelle
Entschuldigung, ich habe den Kontext für meine Frage vergessen. "Capture" ist ein Teil des Emacs Org-Modus
Myotis

Antworten:

6

Sie sollten in der Lage sein, das functionZielformular zu verwenden, um dies zu tun:

(defun my/org-file-by-date ()
  "Create an Org file with current time as name."
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))

(add-to-list 'org-capture-templates
             '("x" "Template Name" plain
              (function my/org-file-by-date)
              "Capture template contents"))

Bearbeiten 2 : Wie sich herausstellt, wird Code, der an ein fileFormular oder ähnliches übergeben wird, erst nach der Erfassungszeit ausgewertet. Daher gibt es eine kompaktere Möglichkeit, dies zu tun. Siehe Erik Sjöstrand Antwort für ein Beispiel.

Bearbeiten 1 : Um ähnliche Funktionen zu erhalten, ohne die Erfassungsoberfläche zu durchlaufen, können Sie ähnliche Funktionen verwenden.

(defun my/org-file-by-date-with-inline-skeleton ()
  "Create Org file from skeleton with current time as name."
  (interactive)
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org"))
  (insert "Skeleton contents"))

(defun my/org-file-by-date-with-file-skeleton ()
  "Create Org file from skeleton file with current time as name."
  (interactive)
  (let ((filename (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (copy-file "path/to/skeleton/file" filename)
    (find-file filename)))
Aaron Harris
quelle
Recht. Ich habe meine Antwort so bearbeitet, dass sie auf Ihre zeigt.
8.
Vielen Dank ! Ich sehe beim Testen des Codes, dass es möglicherweise überhaupt nicht notwendig ist, die Erfassungsfunktion zu verwenden. Weil ich sehr viel in jede dieser Dateien schreibe und dann bei Cc c schließen muss. Ich würde es vorziehen, direkt in die erstellte Datei zu schreiben und wie gewohnt zu speichern. Wie kann ich eine Datei mit dem Namen% Y-% m-% d -% H-% M-% S.org erstellen, die festen Text enthält (vielleicht von einem Skelett?) Und sie dann zum Schreiben öffnen?
Myotis
Ich habe gerade zwei Funktionen hinzugefügt, die eine Erfassung vollständig vermeiden. Ich denke, das ist es, wonach du suchst.
Aaron Harris
1

Es scheint keine eingebaute Funktionalität dafür zu geben ( Bearbeiten : Ja, siehe unten). Die einfachste Lösung, bei der Sie sich nicht mit den Interna der Erfassungsfunktion befassen müssen, besteht darin, den Wert von org-default-notes-filezum Zeitpunkt der Erfassung zu binden :

(defun my-org-capture-advice (func &rest args)
   (let ((org-default-notes-file
         (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (apply func args)))

(advice-add 'org-capture :around #'my-org-capture-advice)

Dieser Ratschlag erfolgt sehr früh, sodass noch nicht bekannt ist, welche Vorlage Sie verwenden werden. Wenn der Name der Datei von der Erfassungsvorlage abhängt, müssen Sie sich wahrscheinlich beraten lassen org-capture-set-target-location.

Bearbeiten : Das functionVorlagenziel ist ein besserer Weg, um dies zu erreichen. Ein Beispiel finden Sie in Aarons Antwort.

jch
quelle
Vielen Dank! Ich bin nicht sicher, wie ich Ihren Code verwenden soll. Ich habe es meiner init.el-Datei hinzugefügt. Was mache ich mehr?
Myotis
Genau das, was Sie normalerweise tun, um die org-captureFunktion aufzurufen - C-c cwenn Sie den Ratschlägen im Org-Handbuch gefolgt sind.
8.
Ich verstehe es immer noch nicht. Wenn ich "Mx my-org-Capture-Rat" eingebe, passiert nichts. Wenn ich mein normales Cc c eingebe, erhalte ich meine Liste der Aufnahmen, wie ich sie definiert habe. Woher kommt Ihr Code?
Myotis
Wenn Sie org-capture-templateskeine zu erfassende Datei angeben, wird die ausgewählte Datei nach Ihren Wünschen formatiert.
8.
Ich muss also eine neue Erfassungsdatei ohne eine zu erstellende Datei erstellen, und dann erledigt Ihr Code seine Arbeit.
Myotis
1

Hier ist eine Möglichkeit, alles in der org-capture-templatesListe zu behalten , ohne andere Funktionen zu definieren. org-directorykann in jedes Verzeichnis geändert werden, in dem Sie die Dateien speichern möchten.

(add-to-list 'org-capture-templates
             '("x" "Template name" plain
               (file (expand-file-name
                      (format-time-string "%Y-%m-%d--%H-%M-%S.org")
                      org-directory))
               "This string is inserted in the capture"))
Erik Sjöstrand
quelle