L'organisation a-t-elle des opérations «d'enchevêtrement inverse», par exemple pour collaborer avec des utilisateurs non-organisationnels?

10

Je voudrais écrire mes propres notes / tests / code dans org puis les utiliser org-bable-tanglepour produire des fichiers sources. Cependant, tous ces fichiers sont soumis au contrôle de version et peuvent donc être modifiés depuis l'extérieur de mon environnement organisationnel.

Je voudrais pouvoir avoir un certain nombre de srcblocs et puis s'emmêler à un tas de fichiers différents, dont chacun serait validé pour le contrôle de version. Mais en même temps, être capable de "démêler" chacun de ces fichiers dans mon fichier org après avoir retiré les modifications du contrôle de version.

Existe-t-il un moyen simple de procéder? J'envisage maintenant de jouer avecinsert-file-contents

RJTK
la source
Pourriez-vous donner un petit exemple de ce que vous demandez de faire? Il semble que vous ayez des blocs de code dans un ou plusieurs fichiers d'organisation et que vous souhaitiez que le ou les fichiers générés à partir de l'enchevêtrement de ces blocs soient désassemblés dans les blocs d'origine avec des modifications dans les fichiers d'organisation.
David D.
Essentiellement, le flux de travail serait le suivant: (1) écrire du code alphabétisé dans org. (2) enchevêtrer ce code dans un ou plusieurs fichiers. (3) git valide ces fichiers. (4) déjeuner (5) git tirer les changements de mon collègue. (6) "enchevêtrement inverse" ces changements en blocs de code dans mon fichier org. (7) goto (1).
RJTK

Réponses:

6

Oui, ça l'est org-babel-detangle.

org-babel-detangle est une fonction Lisp interactive compilée en ob-tangle.el.

(org-babel-detangle &optional SOURCE-CODE-FILE)

Propagez les modifications dans le fichier source de retour original au fichier Org. Cela nécessite que les blocs de code soient emmêlés avec des commentaires de lien qui permettent de trouver les blocs de code d'origine.

Vous devez définir l' commentsargument d'en-tête linkpour le faire fonctionner, par exemple,

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello'
#+end_src

puis utilisez M-x org-babel-tanglepour exporter le bloc de code, un nouveau fichier nommé hello.rbsera créé, il devrait avoir un contenu similaire comme le suivant

~ $ cat hello.rb
# [[file:~/foo.org][No heading:1]]
puts 'hello'
# No heading:1 ends here
~ $

Enfin, ouvert hello.rbdans Emacs, le changement helloà hello world, et exécuter M-x org-babel-detangledans hello.rbla mémoire tampon. Le fichier org sera mis à jour

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello world'
#+end_src
xuchunyang
la source
Pourriez-vous être plus précis (ou donner un exemple) sur la façon d'utiliser cette fonction org-babel-detangle. J'ai essayé avec votre code ruby ​​d'utiliser M x org-babel-detangle après avoir emmêlé hello.rb et modifié légèrement le code mais j'ai une erreur "org-babel-detangle: Argument de type incorrect: stringp, nil".
Lgen
@Lgen J'ai mis à jour ma réponse. Et n'oubliez pas de lire org-babel-detanglela docstring pour comprendre le but et l'utilisation.
xuchunyang
Merci pour cette précision. Je n'avais pas compris l'hypothèse selon laquelle le code source devait être édité dans emacs pour permettre un enchevêtrement inverse (j'utilisais un autre éditeur de texte pour modifier le code source). Cela fonctionne comme prévu maintenant.
Lgen
C'est une fonctionnalité intéressante, mais ce n'est pas tout à fait ce que j'espérais trouver. Je ne peux pas vraiment valider les # [...]] commentaires car ils ne signifient rien sauf pour moi. Est-il possible d'annoter un bloc source à démêler d'un fichier entier sans nécessiter le commentaire du lien? Essentiellement juste insert-file-contents?
RJTK
2

Il existe également org-tanglesync , qui a une méthode de synchronisation beaucoup plus simple queorg-babel-detangle

Essentiellement, si un bloc est enchevêtré dans un fichier externe, chaque fois que ce bloc est modifié, le fichier externe est également vérifié, et si un diff est détecté, l'utilisateur est invité à rejeter ou à insérer les modifications externes dans le bloc org src.

Cela a également des fonctions pour traiter automatiquement tous les blocs enchevêtrés dans un tampon. J'espère que ça aide.

Mehmet Tekman
la source