Existe uma boa personalização geral do org-babel para executar de forma assíncrona? Recentemente, planejo usar o MATLAB via org-babel, mas gostaria de uma forma assíncrona, pois alguns cálculos levam tempo.
Não desejo personalizar apenas o ob-matlab. Isso ocorre porque acho que isso deve ser feito no nível da estrutura, e não em um aplicativo. Em outras palavras, uma mesma modificação deve ativar o recurso assíncrono para outras extensões de idioma, por exemplo, idioma R.
Alguém tem uma boa solução? Até agora eu tentei async.el
, bem como deferred.el
para modificar org-babel-execute-safely-maybe
que pode ser encontrada em ob-core.el
no momento.
Respostas:
Até agora, descobri que gerar um novo processo Emacs é uma solução.
Aqui está o que eu fiz.
1. Adicione uma função para iniciar um processo externo do emacs.
init.el
2. Adicione um arquivo de configuração para carregar no novo processo emacs.
A função acima inicia o emacs no
--batch
modo. Portanto, o init.el normal não será carregado.Em vez disso, queremos criar um arquivo de configuração mais curto (para carregar caminhos e assim por diante).
O caminho para o nosso novo arquivo de configuração é armazenado no
async-emacs-repl-org-babel-init-file
snippet acima.org-babel-async-init.el
Aqui nós ...
Nota de rodapé 1: sem essa configuração, a avaliação falhará com
"No org-babel-execute function for $lang!"
Nota de rodapé 2: É claro que você pode carregar o init.el normal em vez de criar um novo arquivo de configuração, se desejar. Faça isso adicionando
(setq org-babel-async-init-file "~/.emacs.d/init")
ao seuinit.el
. Mas acho que criar um arquivo de configuração para esta tarefa é mais direto.3. Além disso ...
Adicionar ao init.el
Adicionar ao org-babel-async-init.el
Adicione a org-babel-async-init.el (pode não ser necessário. Estes são para o MATLAB)
Adicione ao org-babel-async-init.el (talvez você não precise deles. Estes são para Julia, R e outros idiomas que usam o ESS.)
4. Uso
(Após a configuração acima.)
M-x my/async-emacs-repl-org-babel-execute
(em vez de fazerC-c C-c
). Isso iniciará um processo externo do Emacs como um servidor REPL, se necessário, e executará o bloco de origem em que você está.Agradecimentos
Eu aprendi a idéia de iniciar um processo emacs para avaliação de org-babel a partir deste post . Eu gostaria de agradecer ao autor.
Comentários para personalização
A ideia aqui é simples. Iniciar um novo emacs processo como um REPL para Elisp, fazer
find-file
para o mesmo arquivo .org estamos editando,goto-line
para o mesmo ponto do cursor, executarorg-babel-execute-src-block
,save-buffer
. Pare de sair até que o usuário pare o processo (caso contrário, os gráficos desapareceriam imediatamente após serem exibidos). Pode-se naturalmente pensar em estender isso:C-c C-c
vez de executar funções manualmente / definindo um novo atalho de teclado (que pode ser obtido com conselhos).De fato, o sucesso dessa abordagem me parece mostrar uma maneira geral de desenvolver recursos assíncronos no Emacs. Criando uma camada de "comandos", adicione scripts para executar tarefas e tenha uma estrutura para iniciar e reutilizar os processos do emacs. Assim como o framework Symfony do PHP (o PHP não possui threads) possui recursos de comando.
Editar histórico
Código refatorado (02/04/2016). A solução agora reutiliza um processo Emacs (02/04/2016). Solução agora simplificada e possui apenas um
interactive
comando para executar (02/04/2016. Configuração adicionada (12/04/2016)).fonte
async.el
?lambda
função atribuída a ele. Não o usei para esta solução porque não consegui encontrar uma maneira de enviar dados para o novo processo. É necessário comunicar o processo se você quiser usar o recurso: session do org-babel.TERM=vt200 emacs --batch -nw --eval '(load "~/.emacs.d/org-babel-async-init")' --eval '(while t (print (eval (read))))': exited abnormally with code 255.
Desculpe, isso deve ser um comentário e não uma resposta, mas eu simplesmente não tenho pontos suficientes.org-babel-do-load-languages
. 3) O#+SRC_BEGIN
bloco que você está executando contém um erro.M-x my/async-emacs-repl-org-babel-execute
, caso contrário o buffer "org-babel-async" vai reclamar:...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help
. Portanto, se isso puder ser resolvido, seria fantástico. Obrigado mesmo assim por isso, é incrível! A propósito, é possível vinculá-loC-c C-c
ou entrará em conflito com o modo organizacional?Para referências futuras e bibliotecas prontas para uso. Aceitarei este como resposta, porque estes são mais recentes.
ob-async
Aqui está uma biblioteca usando async.el https://github.com/linktohack/ob-async
org-babel-eval-in-repl
Minha outra solução (disponível em melpa): https://github.com/diadochos/org-babel-eval-in-repl
fonte