Si ejecuto los siguientes bloques de shell babel
#+BEGIN_SRC sh :session one :results output
ssh staging
#+END_SRC
#+BEGIN_SRC sh :session one :results output
hostname
#+END_SRC
Org crea un búfer de shell llamado one
, se ejecuta ssh staging
y luego, después de conectarse, se ejecuta hostname
en la puesta en escena. Sin embargo, si modifico el comando ssh y lo ejecuto nuevamente, intenta ejecutarlo desde la sesión uno, desde el host de preparación. Si cierro el búfer one
, restablece la sesión, ya que la próxima vez que se ejecute un comando con ese nombre de sesión, lo vuelve a crear. Lo que no he podido encontrar es un método para forzar a un bloque de babel en particular a inicializar siempre una nueva sesión.
Soy consciente de que para algunos idiomas (elisp en particular) esto no sería posible. Supongo que podría anteponer la sesión con un bloque elisp que contenga (kill-buffer "one")
, pero preferiría que este fuera un argumento de encabezado si es posible. También soy consciente de que para este ejemplo simplemente podría combinar los dos en un solo bloque sin sesión, pero estoy interesado en secuencias más complicadas.
¿Existe un :prologue
comando o algún otro argumento especial :session
que obligue a ese bloque a inicializar un nuevo shell en cada invocación?
org-babel-initiate-session
.Respuestas:
Prueba esto
Fuerce una sesión org-babel para restablecer o inicializar mediante el uso de una instrucción condicional elisp para establecer dinámicamente el valor del encabezado : session en el primer bloque de código.
p.ej
:session (if (get-buffer "one") (if (kill-buffer "one") (print "one") (print "one")) (print "one"))
En el código anterior, la función get-buffer verifica si existe un buffer llamado uno . Si es verdad, el -caché de eliminación función mata el uno búfer continuación, devuelve un valor de
t
onil
cual se pasa a laif
declaración. En este ejemplo específico, laif
instrucción anidada siempre devolverá un valor de uno . Tenga en cuenta que todavía estoy aprendiendo elisp.A continuación se muestra el código de ejemplo actualizado:
Cada vez que se ejecuta el primer bloque de código, emacs le pedirá que elimine el búfer , para que pueda restablecer la sesión cuando lo desee.
Espero que haya ayudado!
Nota: Este código se probó utilizando las siguientes versiones de emacs y org-mode.
En conclusión, encontré inspiración técnica para esta respuesta en el sitio web org-scraps y este código de ejemplo kill-buffer en stackoverflow.
fuente
kill-buffer
para forzar una nueva sesión, pero estaba más interesado en aprender si había un argumento de bloque incorporado en el modo org, o alguna otra convención establecida para hacerlo. de lo que no estaba al tanto. Su enfoque es una buena solución, pero espero que haya un enfoque canónico para esto.:session one :session-reset yes
?Inspirado por @Melioratus.
Actualmente, org-babel proporciona un gancho llamado
org-babel-after-execute-hook
. Extendí los argumentos admitidos del bloque org-babel src al usarlo:(Estoy usando org-babel para elixir. Si desea soporte de otros idiomas, extiéndalo
cond
usted mismo).Después de evaluar el código anterior, puede escribir un bloque src como este:
Después de evaluar el bloque src, org-babel limpiará la sesión correspondiente.
fuente