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.


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

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.


¡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"))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.