10 votes

Attribuer des ID à chaque entrée en mode Org

Org-mode dispose d'une extension groupée appelée org-id qui met en œuvre des identifiants uniques globaux pour les fichiers org-mode. Chaque entrée (un titre avec son corps) peut avoir une propriété ID dans sa propriété :PROPERTIES: tiroir.

Un nouvel ID pour une seule entrée peut être attribué avec une fonction org-id-get-create .

Comment puis-je attribuer un ID à chaque entrée d'un fichier org-mode ?

Je pourrais utiliser une méthode Emacs pour automatiser cela, comme une macro qui appelle org-id-get-create pour chaque chaîne commençant par * . Mais j'aimerais savoir si org-mode a déjà cette capacité. Si ce n'est pas le cas, veuillez me recommander la manière la plus idiomatique d'écrire un code elisp dans ce but.

14voto

Anand Vaidya Points 181

Je suis d'accord avec Stuart, je ne pense pas qu'il y ait quoi que ce soit dans org-id qui permette de faire cela automatiquement. quand vous voulez ajouter les identifiants.

Si vous utilisez org-capture pour ajouter tous vos articles, puis org-capture-prepare-finalize-hook est un endroit logique pour mettre le code :

(add-hook 'org-capture-prepare-finalize-hook 'org-id-get-create)

Alternativement, vous pouvez faire comme Stuart l'a suggéré et ajouter un crochet de sauvegarde pour les fichiers org-mode. Je pense que la manière la plus idiomatique de traiter tous les titres du fichier serait d'utiliser la fonction API de cartographie :

(defun my/org-add-ids-to-headlines-in-file ()
  "Add ID properties to all headlines in the current file which
do not already have one."
  (interactive)
  (org-map-entries 'org-id-get-create))

Enfin, il nous suffit d'ajouter un before-save-hook qui ne fonctionne qu'en mode org-mode :

(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))

Ça devrait le faire !

13voto

Stuart Hickinbottom Points 459

J'ai cherché dans la source et je n'ai rien trouvé d'évident pour le faire déjà. Je sais que c'est utilisé par Org-mobile mais je n'ai pas beaucoup d'expérience dans ce domaine.

En guise d'introduction, l'extrait suivant va parcourir en boucle tous les en-têtes du fichier courant (les en-têtes en mode Org sont en fait des en-têtes standard d'Emacs), et ajouter un ID s'il n'y en a pas déjà un :

   (require 'org-id)
   (save-excursion
      (goto-char (point-max))
      (while (outline-previous-heading)
        (org-id-get-create)))

(Si vous vous demandez pourquoi cette boucle revient en arrière sur le tampon plutôt que d'avancer, c'est parce que la fonction while loop appellera toujours la fonction de navigation du contour au moins une fois et si votre fichier en mode Org commence par un titre, celui-ci sera ignoré si vous avancez).

Ceci pourrait être utilisé assez facilement dans une boucle sur tous les fichiers connus de l'agenda Org-mode en bouclant sur les entrées retournées par la fonction (org-agenda-files) ou ajouté à un crochet de sauvegarde pour les fichiers en mode Org.

Si quelqu'un de plus agile que moi n'y arrive pas en premier, si vous pouvez identifier quand si vous souhaitez que les identifiants soient ajoutés, je pourrais probablement développer ce qui précède pour en faire une solution complète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X