Emacs: fonction pour créer un fichier avec la date / l'heure comme nom de fichier, et un raccourci pour celui-ci

8

Je dois générer des fichiers texte au format de nom suivant: YYYYY-MM-DD--hh-mm-ss.org. Comment puis-je utiliser la fonctionnalité de capture pour cela? Autrement dit, au lieu de faire une entrée par capture dans un seul fichier, la fonction devrait créer un seul fichier par capture, et avec un peu de chance avec toutes les possibilités du mécanisme de capture.

myotis
la source
Désolé, j'ai oublié le contexte de ma question. "capture" fait partie du mode org d'emacs
myotis

Réponses:

6

Vous devriez pouvoir utiliser le functionformulaire cible pour ce faire:

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

Edit 2 : Il s'avère que le code transmis à un fileformulaire ou similaire n'est évalué qu'au moment de la capture, il existe donc un moyen plus compact de le faire. Voir la réponse d'Erik Sjöstrand pour un exemple.

Édition 1 : pour obtenir des fonctionnalités similaires sans passer par l'interface de capture, vous pouvez utiliser des fonctions similaires à celles-ci.

(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
la source
Droite. J'ai modifié ma réponse pour pointer la vôtre.
2015
Merci ! Je vois, en testant le code, qu'il n'est peut-être pas nécessaire d'utiliser la fonctionnalité de capture du tout. Parce que j'écris beaucoup dans chacun de ces fichiers, puis je dois fermer par Cc c. Je préfère écrire directement dans le fichier créé et enregistrer comme d'habitude. Comment puis-je créer un fichier nommé% Y-% m-% d -% H-% M-% S.org et contenant du texte fixe (à partir d'un squelette peut-être?), Puis l'ouvrir pour l'écriture?
myotis
Je viens d'ajouter deux fonctions qui évitent complètement la capture. Je pense que c'est ce que vous recherchez.
Aaron Harris
1

Il ne semble pas y avoir de fonctionnalité intégrée pour le faire ( modifier : oui, voir ci-dessous). La solution la plus simple, qui ne nécessite pas de fouiller dans les internes de la fonctionnalité de capture, est de lier la valeur de org-default-notes-fileau moment de la capture:

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

Ce conseil arrive très tôt, donc il ne sait pas encore quel modèle vous allez utiliser. Si le nom du fichier dépend du modèle de capture, vous aurez probablement besoin de conseils org-capture-set-target-location.

Modifier : la functioncible du modèle est un meilleur moyen d'y parvenir. Voir la réponse d'Aaron pour un exemple.

jch
la source
Merci! Je ne sais pas comment utiliser votre code. Je l'ai ajouté à mon fichier init.el. Que dois-je faire de plus?
myotis
Tout ce que vous faites habituellement pour appeler la org-capturefonction - C-c csi vous avez suivi les conseils du manuel Org.
2015
Je ne comprends toujours pas. Si je tape "Mx my-org-capture-advice", rien ne se passe. Lorsque je tape mon Cc normal, j'ai obtenu ma liste de captures telles que je les ai définies. Alors, d'où vient votre code?
myotis
Si vous org-capture-templatesne spécifiez pas de fichier à capturer, le fichier choisi sera formaté comme vous le souhaitez.
2015
J'ai donc besoin de créer un nouveau fichier de capture sans fichier dans lequel capturer, puis votre code fera son travail?
myotis
1

Voici un moyen de tout garder dans la org-capture-templatesliste, sans définir d'autres fonctions. org-directorypeut être remplacé par le répertoire dans lequel vous souhaitez stocker les fichiers.

(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
la source