Se eu executar os seguintes blocos de shell babel
#+BEGIN_SRC sh :session one :results output
ssh staging
#+END_SRC
#+BEGIN_SRC sh :session one :results output
hostname
#+END_SRC
A organização cria um buffer de shell chamado one
, executa ssh staging
e, em seguida, após a conexão, executa hostname
na preparação. No entanto, se eu ajustar o comando ssh e executá-lo novamente, ele tentará executá-lo a partir da sessão um, do host intermediário. Se eu fechar o buffer, one
ele redefinirá a sessão como na próxima vez que qualquer comando for executado com esse nome de sessão, ele será recriado. O que não consegui encontrar é um método para forçar um bloco babel específico a sempre inicializar uma nova sessão.
Estou ciente de que, para alguns idiomas (elisp em particular), isso não seria possível. Suponho que eu poderia preceder a sessão com um bloco elisp contendo (kill-buffer "one")
, mas preferiria que esse fosse um argumento de cabeçalho, se possível. Também estou ciente de que, para este exemplo, eu poderia simplesmente combinar os dois em um único bloco sem sessão, mas estou interessado em sequências mais complicadas.
Existe um :prologue
comando ou algum outro argumento especial para as :session
forças que bloqueiam a inicialização de um novo shell em cada chamada?
org-babel-initiate-session
.Respostas:
Tente isto
Force uma sessão org-babel a redefinir ou inicializar usando uma instrução condicional elisp para definir dinamicamente o valor do cabeçalho : session no primeiro bloco de código.
por exemplo
:session (if (get-buffer "one") (if (kill-buffer "one") (print "one") (print "one")) (print "one"))
No código acima, a função get-buffer verifica se o buffer denominado um existe. Se verdadeiro, a função kill-buffer mata o único buffer e, em seguida, retorna um valor de
t
ounil
que é passado para aif
instrução Neste exemplo específico, aif
instrução aninhada sempre retornará um valor de um . Observe que ainda estou aprendendo elisp.Abaixo está o código de exemplo atualizado:
Cada vez que o primeiro bloco de código é executado, o emacs solicita a eliminação de um buffer , para que você possa redefinir a sessão quando desejar.
Espero que tenha ajudado!
Nota: Este código foi testado usando as seguintes versões do emacs e do modo organizacional.
Em conclusão, encontrei inspiração técnica para esta resposta no site org-scraps e este código de exemplo de buffer de interrupção no stackoverflow.
fonte
kill-buffer
para forçar uma nova sessão, mas estava mais interessado em saber se havia um argumento de bloco incorporado no modo organizacional ou em alguma outra convenção estabelecida para fazer isso. que eu não estava ciente. Sua abordagem é uma boa solução, mas espero que exista uma abordagem canônica para isso.:session one :session-reset yes
?Inspirado por @Melioratus.
Atualmente, o org-babel fornece um gancho chamado
org-babel-after-execute-hook
. Estendi os argumentos suportados do bloco org-babel src usando-o:(Estou usando o org-babel para elixir. Se você deseja suporte para outros idiomas, estenda
cond
sozinho.)Após avaliar o código acima, você pode escrever o bloco src assim:
Após avaliar o bloco src, o org-babel limpará a sessão correspondente.
fonte