Wenn ich die folgenden Babel-Shell-Blöcke ausführe
#+BEGIN_SRC sh :session one :results output
ssh staging
#+END_SRC
#+BEGIN_SRC sh :session one :results output
hostname
#+END_SRC
Org erstellt einen Shell-Puffer namens one
, wird ausgeführt ssh staging
und nach dem Verbinden hostname
beim Staging ausgeführt. Wenn ich jedoch den Befehl ssh optimiere und erneut ausführe, wird versucht, ihn innerhalb der ersten Sitzung vom Staging-Host aus auszuführen. Wenn ich den Puffer schließe one
, wird die Sitzung zurückgesetzt, wenn ein Befehl das nächste Mal mit diesem Sitzungsnamen ausgeführt wird, wird er neu erstellt. Was ich nicht finden konnte, ist eine Methode, um einen bestimmten Babel-Block zu zwingen, immer eine neue Sitzung zu initialisieren.
Mir ist bewusst, dass dies für einige Sprachen (insbesondere Elisp) nicht möglich wäre. Ich nehme an, ich könnte der Sitzung einen Elisp-Block voranstellen, der enthält (kill-buffer "one")
, aber dies wäre, wenn möglich, eher ein Header-Argument. Mir ist auch bewusst, dass ich für dieses Beispiel die beiden einfach ohne Sitzung zu einem einzigen Block kombinieren könnte, aber ich bin an komplizierteren Sequenzen interessiert.
Gibt es einen :prologue
Befehl oder ein anderes spezielles Argument, :session
das diesen Block zwingt, bei jedem Aufruf eine neue Shell zu initialisieren?
org-babel-initiate-session
.Antworten:
Versuche dies
Erzwingen Sie das Zurücksetzen oder Initialisieren einer org-babel-Sitzung mithilfe einer elisp-bedingten Anweisung , um den Wert des : session- Headers im ersten Codeblock dynamisch festzulegen .
z.B
:session (if (get-buffer "one") (if (kill-buffer "one") (print "one") (print "one")) (print "one"))
Im obigen Code prüft die Funktion get-buffer , ob ein Puffer mit dem Namen one vorhanden ist. Wenn true, löscht die Kill-Buffer- Funktion den einen Puffer und gibt dann einen Wert von oder zurück, der an die Anweisung übergeben wird. In diesem speziellen Beispiel gibt die verschachtelte Anweisung immer den Wert Eins zurück . Bitte beachte, ich lerne immer noch Elisp.
t
nil
if
if
Unten finden Sie den aktualisierten Beispielcode:
Jedes Mal, wenn der erste Codeblock ausgeführt wird, fordert emacs Sie auf, den einen Puffer zu beenden , damit Sie die Sitzung zurücksetzen können, wenn Sie dies wünschen.
Hoffe das hat geholfen!
Hinweis: Dieser Code wurde mit den folgenden Versionen von Emacs und Org-Mode getestet.
Zusammenfassend fand ich technische Inspiration für diese Antwort auf der org-scraps- Website und diesen Kill-Buffer-Beispielcode für Stackoverflow.
quelle
kill-buffer
, um eine neue Sitzung zu erzwingen, aber ich war mehr daran interessiert zu erfahren, ob ein Blockargument in den Organisationsmodus eingebaut ist oder eine andere etablierte Konvention, um dies zu tun das war mir nicht bewusst. Ihr Ansatz ist eine gute Lösung, aber ich hoffe, dass es dafür einen kanonischen Ansatz gibt.:session one :session-reset yes
?Inspiriert von @Melioratus.
Derzeit bietet org-babel einen Hook namens
org-babel-after-execute-hook
. Ich habe die unterstützten Argumente des org-babel src-Blocks damit erweitert:(Ich verwende org-babel als Elixier. Wenn Sie Unterstützung für andere Sprachen wünschen, erweitern Sie diese
cond
selbst.)Nachdem Sie den obigen Code ausgewertet haben, können Sie den src-Block wie folgt schreiben:
Nach dem Auswerten des src-Blocks bereinigt org-babel die entsprechende Sitzung.
quelle