Si je lance les blocs shell babel suivants
#+BEGIN_SRC sh :session one :results output
ssh staging
#+END_SRC
#+BEGIN_SRC sh :session one :results output
hostname
#+END_SRC
Org crée un tampon shell appelé one
, s'exécute ssh staging
puis, après la connexion, s'exécute hostname
lors du transfert. Cependant, si je modifie la commande ssh et l'exécute à nouveau, elle tente de l'exécuter à partir de la première session, à partir de l'hôte intermédiaire. Si je ferme le tampon, one
il réinitialise la session car la prochaine fois qu'une commande est exécutée avec ce nom de session, il la recrée. Ce que je n'ai pas pu trouver, c'est une méthode pour forcer un bloc babel particulier à toujours initialiser une nouvelle session.
Je suis conscient que pour certaines langues (elisp en particulier), cela ne serait pas possible. Je suppose que je pourrais ajouter la session à un bloc elisp contenant (kill-buffer "one")
, mais je préfère que ce soit un argument d'en-tête si possible. Je suis également conscient que pour cet exemple, je pourrais simplement combiner les deux en un seul bloc sans session, mais je suis intéressé par des séquences plus compliquées.
Existe-t-il une :prologue
commande ou un autre argument spécial :session
qui force ce bloc à initialiser un nouveau shell à chaque appel?
org-babel-initiate-session
.Réponses:
Essaye ça
Forcer une session org-babel à se réinitialiser ou à s'initialiser à l'aide d'une instruction conditionnelle elisp pour définir dynamiquement la valeur de l'en - tête : session sur le premier bloc de code.
par exemple
:session (if (get-buffer "one") (if (kill-buffer "one") (print "one") (print "one")) (print "one"))
Dans le code ci-dessus, la fonction get-buffer vérifie si un tampon nommé un existe. Si cela est vrai, le kill-buffer fonction tue l' un tampon retourne une valeur d'alors
t
ounil
qui est passé à laif
déclaration. Dans cet exemple spécifique, l'if
instruction imbriquée renvoie toujours une valeur de un . Veuillez noter que j'apprends encore elisp.Voici l'exemple de code mis à jour:
Chaque fois que le premier bloc de code est exécuté, emacs demandera de tuer le seul tampon , afin que vous puissiez réinitialiser la session quand vous le souhaitez.
J'espère que cela a aidé!
Remarque: Ce code a été testé à l'aide des versions suivantes d'emacs et du mode org.
En conclusion, j'ai trouvé l'inspiration technique pour cette réponse sur le site Web org-scraps et cet exemple de code kill-buffer sur stackoverflow.
la source
kill-buffer
pour forcer une nouvelle session, mais j'étais plus intéressé à savoir s'il y avait un argument de bloc intégré au mode org, ou une autre convention établie pour le faire. que je n'étais pas au courant. Votre approche est une bonne solution de contournement, mais j'espère qu'il existe une approche canonique pour cela.:session one :session-reset yes
?Inspiré par @Melioratus.
Actuellement, org-babel fournit un crochet appelé
org-babel-after-execute-hook
. J'ai étendu les arguments pris en charge du bloc org-babel src en l'utilisant:(J'utilise org-babel pour élixir. Si vous voulez des supports d'autres langues, développez
cond
vous-même.)Après avoir évalué le code ci-dessus, vous pouvez écrire un bloc src comme ceci:
Après avoir évalué le bloc src, org-babel nettoiera la session correspondante.
la source