Mariusz Borkowski - strona prywatna
Blog: Kłopoty w emacs z noweb i async
Table of Contents
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 & ")