Jak dołączyć dane wyjściowe polecenia powłoki do bloku kodu źródłowego w trybie org?

12

Na przykład dostałem wersję demonstracyjną, która pokazuje polecenie i jego wynik, i chcę wstawić je do .orgpliku takiego jak fragment kodu źródłowego C lub coś takiego. Chcę wtedy móc wyeksportować plik do pliku HTML i wyróżnić blok tak, jak w wielu książkach.

Na przykład mam

#+BEGIN_SRC shell
$ ls
dir1
dir2
file1
file2
...
or any other examples like this
...
#+END_SRC

ale nie można go przekonwertować na HTML: komunikat o błędzie, który czyta

shell-mode: Nieprawidłowy typ argumentu: processp, zero

cały czas się pojawia. Jakiego trybu powinienem użyć do zamiany shell, a jeśli nie powinienem używać tego #+BEGIN_SRC...#+END_SRCformatu, czego powinienem użyć?

CodyChan
źródło

Odpowiedzi:

16

Jeśli chcesz samodzielnie konstruować przykłady (to właśnie otrzymuję z twojego pytania, ale popraw mnie, jeśli się mylę), użyj EXAMPLEbloku zamiast SRCbloku:

#+BEGIN_EXAMPLE
$ ls
dir1
dir2
file1
file2
...
#+END_EXAMPLE

Podczas eksportowania do HTML blok ten staje się:

<pre class="example">
$ ls
dir1
dir2
file1
file2
...
</pre>

Jak widać, zawartość wyeksportowanego bloku jest dokładnie taka sama jak zawartość oryginalnego EXAMPLEbloku.


Jeśli faktycznie chcesz uruchomić jedno lub więcej poleceń, aby dynamicznie generować dane wyjściowe i dołączyć zarówno polecenia, jak i wyniki do dokumentu HTML, musisz zmodyfikować SRCblok, aby wyglądał następująco:

#+BEGIN_SRC sh :exports both
ls
#+END_SRC

Jeśli wyjście lskomendy zawiera katalogi i pliki, które są wymienione w przykładzie ( dir1, dir2, file1, file2), to będzie eksportować do:

<div class="org-src-container">
  <pre class="src src-sh">
    ls
  </pre>
</div>

<table>
  <colgroup>
    <col class="left" />
  </colgroup>
  <tbody>
    <tr>
      <td class="left">dir1</td>
    </tr>
    <tr>
      <td class="left">dir2</td>
    </tr>
    <tr>
      <td class="left">file1</td>
    </tr>
    <tr>
      <td class="left">file2</td>
    </tr>
  </tbody>
</table>

Jak widać, sam kod jest zawinięty w blok kodu, a wyniki są wymienione w tabeli.

Pamiętaj , że musisz włączyć obsługę shbloków kodu jawnie poprzez:

(require 'ob-sh)
(org-babel-do-load-languages 'org-babel-load-languages '((sh . t)))

Wynika to z faktu, że domyślnie Org Babel włącza obsługę bloków kodu Emacs Lisp (jak wyjaśniono tutaj ).

itsjeyd
źródło
Dziękuję za tę obsprawę, mam jeszcze dwa problemy 1: czy jest jakaś built-in shortcutwstawić parę BEGIN_EXAMPLE, na przykład <s then TABwstawić BEGIN_EXAMPLEoprócz, aby zdefiniować fragment yasnippet? 2: Otrzymałem org-html-handle-links: Wrong type argument: stringp, nilkomunikat o błędzie po zmianie, BEGIN_EXAMPLEale nic więcej, coś musi być nie tak z linkiem w moim pliku org, jest ich wiele, w jaki sposób mogę org-exportpokazać więcej szczegółów, takich jak numer linii, który jest nieprawidłowy, gdy eksport nie powiódł się ??
CodyChan,
Odpowiadając na twoje pierwsze pytanie: Tak, po nim <enastępuje TAB. Zobacz Łatwe szablony, aby uzyskać pełną listę.
itsjeyd
Co do twojego drugiego pytania: nie jestem pewien, czy wiem, co masz na myśli. Jakie linki? W oryginalnym przykładzie nie ma żadnych linków. Jako ogólna rada, spróbuj najpierw uzyskać minimalny przykład. Włóż EXAMPLEblok, jak pokazano w mojej odpowiedzi, do nowego pliku. Nie dodawaj nic więcej. Następnie spróbuj go wyeksportować i zobaczyć, co się stanie. Jeśli to działa, stopniowo dodawaj kolejne elementy i kontynuuj eksportowanie. Jeśli w pewnym momencie napotkasz błąd, będziesz wiedział, że powoduje go ostatni dodany (lub zmieniony) dodatek.
itsjeyd
Problem z moim oryginalnym postem został rozwiązany przez BEGIN_EXAMPLE. Błąd BEGIN_EXAMPLE jest lokalizowany org-exportsam, więc wiem, że jest to problem BEGIN_SRC, ale w moim oryginalnym pliku jest o wiele więcej, potem pojawia się org-exporttylko org-html-handle-links: Wrong type argument: stringp, nilkomunikat o błędzie i nie wiem, gdzie jest dokładna pozycja.
CodyChan,
@CodyChan Nie obserwuję. Jeśli chcesz, żebym rzucił okiem na zawartość pliku, który próbujesz wyeksportować, dodaj go do swojego pytania (możesz później usunąć ponownie).
itsjeyd