Emacs: función para crear un archivo con fecha / hora como nombre de archivo y un acceso directo para él

8

Necesito para generar archivos de texto con el siguiente formato de nombre: YYYYY-MM-DD--hh-mm-ss.org. ¿Cómo puedo usar la funcionalidad de captura para esto? Es decir, en lugar de hacer una entrada por captura en un solo archivo, la función debe hacer un solo archivo por captura y, con suerte, con todas las posibilidades dentro del mecanismo de captura.

miotis
fuente
Lo siento, olvidé el contexto de mi pregunta. "capture" es parte del modo org de emacs
myotis

Respuestas:

6

Debería poder utilizar el functionformulario de destino para hacer esto:

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

Edición 2 : Resulta que el código pasado a un fileformulario o similar no se evalúa hasta el momento de la captura, por lo que hay una forma más compacta de hacerlo. Ver la respuesta de Erik Sjöstrand para un ejemplo.

Edición 1 : para obtener una funcionalidad similar sin pasar por la interfaz de captura, puede usar funciones similares a estas.

(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
fuente
Derecha. He editado mi respuesta para señalar la suya.
jch
Gracias ! Veo, al probar el código, que tal vez no sea necesario usar la funcionalidad de captura en absoluto. Porque escribo mucho en cada uno de estos archivos, y luego tengo que cerrar por Cc c. Preferiría escribir directamente en el archivo creado y guardar como de costumbre. ¿Cómo puedo crear un archivo llamado% Y-% m-% d -% H-% M-% S.org y que contenga texto fijo (tal vez desde un esqueleto) y luego abrirlo para escribir?
myotis
Acabo de agregar dos funciones que evitan la captura por completo. Creo que esto es lo que estás buscando.
Aaron Harris
1

No parece haber ninguna funcionalidad incorporada para hacer eso ( editar : sí, ver abajo). La solución más simple, una que no requiere profundizar en lo interno de la funcionalidad de captura, es vincular el valor org-default-notes-fileen el momento de la captura:

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

Este consejo ocurre muy temprano, por lo que aún no sabe qué plantilla va a utilizar. Si el nombre del archivo depende de la plantilla de captura, entonces probablemente necesite asesoramiento org-capture-set-target-location.

Editar : el functionobjetivo de la plantilla es una mejor manera de lograrlo. Vea la respuesta de Aaron para un ejemplo.

jch
fuente
¡Gracias! No estoy seguro de cómo usar su código. Lo he agregado a mi archivo init.el. ¿Qué hago más?
myotis
Haga lo que haga para invocar la org-capturefunción, C-c csi ha seguido los consejos del manual Org.
jch
Sigo sin entender. Si escribo "Mx my-org-capture-advice" no pasa nada. Cuando escribo mi Cc c normal, obtengo mi lista de capturas tal como las he definido. Entonces, ¿dónde entra tu código?
myotis
Si org-capture-templatesno especifica un archivo para capturar, el archivo elegido se formateará como desee.
jch
así que necesito hacer un nuevo archivo de captura sin un archivo para capturar, y luego su código hará su trabajo.
myotis
1

Aquí hay una manera de mantenerlo todo en la org-capture-templateslista, sin definir otras funciones. org-directoryse puede cambiar a cualquier directorio en el que desee almacenar los archivos.

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