Mariusz Borkowski - strona prywatna
Blog: Kłopoty w emacs z noweb i async

Table of Contents

Strona głównaDydaktykaO mnie/dane adresoweBlog

Kłopoty w emacs z noweb i async

Problem

Po uruchomieniu kodu w noweb w emacsie niemożliwe jest uruchomienie kodu w async. Najprostszy przykład:

Uruchom w czystym emacsie

emacs --no-init-file

poniższy kod:

#+begin_src elisp
  (package-initialize)
  (require 'ob-async)
#+end_src

#+begin_src elisp
"1"
#+end_src

#+begin_src elisp :async
"2"
#+end_src

#+begin_src elisp :noweb yes
"3"
#+end_src

#+begin_src elisp
"4"
#+end_src

#+begin_src elisp :async
"5"
#+end_src

#+begin_src elisp :async
"5"
#+end_src

#+begin_src elisp
(async-shell-command "ls -ls")
#+end_src

#+RESULTS:
: #<window 35 on *Async Shell Command*>

Rozwiązanie (workaround)

Załóżmy, że chcemy wywołać poniższy kod w shellu.

echo "1"
sleep 1
echo "2"

Oczywiście nie damy rady go wywołać z modyfikatorem :async Ale możemy spróbować ominąć problem korzystając z…. noweb! :)

pwd
sleep 1
pwd
(async-shell-command "
pwd
sleep 1
pwd
")

Ten sposób będzie się nieźle nadawał do wywoływania jednolinijkowego operacji, skryptów w bashu. Posiada on niestety pewne ograniczenie…

Ograniczenia:

Stringi

Problem pojawi się jeśli w kodzie będziemy chcieli użyć stringów. Wtedy trzeba będzie zastosować znak ucieczki przez co kod przestanie sie ''ładnie'' tanglować…

echo \"1\"
sleep 1
echo \"2\"
(async-shell-command "
echo \"1\"
sleep 1
echo \"2\"
")

Wywołanie kodu z przejściem do backgroundu

Niestety nie zadziała również to:

chromium &
(async-shell-command "
chromium &
")

Author: mb

Date: 2025-02-17 Mon 18:24

Emacs 29.4 (Org mode 9.6.15)