Emacs: funzione per creare un file con data / ora come nome file e un collegamento per esso


8

Ho bisogno di generare file di testo con il seguente formato nome: YYYYY-MM-DD--hh-mm-ss.org. Come posso utilizzare la funzionalità di acquisizione per questo? Cioè, invece di creare una voce per acquisizione in un singolo file, la funzione dovrebbe creare un singolo file per acquisizione, e si spera con tutte le possibilità all'interno del meccanismo di acquisizione.


Scusa, ho dimenticato il contesto per la mia domanda. "capture" fa parte di emacs org-mode
myotis l'

Risposte:


6

Dovresti essere in grado di utilizzare il functionmodulo di destinazione per fare questo:

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

Modifica 2 : A quanto pare, il codice passato a un filemodulo o simili non viene valutato fino al momento dell'acquisizione, quindi c'è un modo più compatto per farlo. Vedi la risposta di Erik Sjöstrand per un esempio.

Modifica 1 : per ottenere funzionalità simili senza passare attraverso l'interfaccia di acquisizione, è possibile utilizzare funzioni simili a queste.

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

Giusto. Ho modificato la mia risposta per indicare la tua.
jch

Grazie ! Vedo testando il codice che forse non è affatto necessario utilizzare la funzionalità di acquisizione. Perché scrivo molto in ciascuno di questi file e quindi devo chiudere con Cc c. Preferirei scrivere direttamente nel file creato e salvarlo normalmente. Come posso creare un file chiamato% Y-% m-% d -% H-% M-% S.org e contenente del testo fisso (forse da uno scheletro?) E aprirlo per la scrittura?
myotis,

Ho appena aggiunto due funzioni che evitano completamente l'acquisizione. Penso che questo sia quello che stai cercando.
Aaron Harris,

1

Non sembra esserci alcuna funzionalità integrata per farlo ( modifica : sì, vedi sotto). La soluzione più semplice, quella che non richiede approfondimenti all'interno della funzionalità di acquisizione, è quella di associare il valore org-default-notes-fileal momento dell'acquisizione:

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

Questo consiglio arriva molto presto, quindi non sa ancora quale modello utilizzerai. Se il nome del file dipende dal modello di acquisizione, probabilmente avrai bisogno di consigli org-capture-set-target-location.

Modifica : l' functionobiettivo del modello è un modo migliore per raggiungere questo obiettivo. Vedi la risposta di Aaron per un esempio.


Grazie! Non sono sicuro di come usare il tuo codice. L'ho aggiunto al mio file init.el. Cosa faccio di più?
myotis,

Qualunque cosa tu faccia di solito per invocare la org-capturefunzione, C-c cse hai seguito i consigli nel manuale Org.
jch

Continuo a non capire. Se scrivo "Mx my-org-capture-advice" non succede nulla. Quando digito il mio normale Cc ho ottenuto il mio elenco di acquisizioni come le ho definite. Quindi da dove viene il tuo codice?
myotis,

Se org-capture-templatesnon si specifica un file in cui acquisire, il file scelto verrà formattato come desiderato.
jch

quindi devo creare un nuovo file di acquisizione senza un file in cui acquisire e quindi il tuo codice farà il suo lavoro?
myotis,

1

Ecco un modo per mantenerlo tutto org-capture-templatesnell'elenco, senza definire altre funzioni. org-directorypuò essere modificato in qualsiasi directory in cui si desidera archiviare i file.

(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"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.