Emacs Org-mode Babel: "Клубок" к блоку результатов

343
alyssackwan

Я хочу использовать org-mode для вычисления длинных проходов путем объединения фрагментов.

Я открыт для не вавилонского подхода. Мне приходили в голову таблицы, но я не мог понять, как ссылаться на ячейку вне таблицы таким образом, чтобы импортировать содержимое ячейки, а не только ссылки на нее.

В Babel у меня есть текстовые блоки, на которые я ссылаюсь через noweb в конечном текстовом блоке. Я не могу понять, как заставить текстовый блок излучать что-либо #+RESULTS:. Там нет eval двигателя. Я попытался использовать elisp, но переводы строки запутали его, и я не могу отформатировать Mq иначе, так как встроенные функции являются интерактивными. Для текстового режима я могу запутать внешний файл, но не встроенный.

Есть идеи? Я должен что-то упустить. Я не могу представить, что это сложно.

[РЕДАКТИРОВАТЬ]:

#+NAME: abc #+BEGIN_SRC text This is a string that is way too long to be on one line. The point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block. #+END_SRC  #+NAME: def #+BEGIN_SRC text This is also a string that is way too long to be on one line. Again, the point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block. #+END_SRC  #+BEGIN_SRC elisp :noweb yes :results output (princ "<<abc>>") (princ "<<def>>") #+END_SRC 

При оценке я получаю сообщение «Конец файла при разборе». Когда я подключаюсь к внешнему файлу для проверки, я вижу следующее:

(princ "This is a string that is way too long to be on one line. (princ "The point of this whole question is that blocks with hard paragraph (princ "breaks don't work with the elisp noweb block.") (princ "This is also a string that is way too long to be on one line. (princ "Again, the point of this whole question is that blocks (princ "with hard paragraph breaks don't work with the elisp (princ "noweb block.") 

Обратите внимание, что нетерминальные строки в каждом текстовом блоке не получают двойные кавычки или закрывающие скобки. Это явно уродливый элисп.

Опять же, мне все равно, как это делается. Я просто хочу иметь возможность вычислять длинные текстовые отрывки, которые либо хорошо переносятся, либо сохраняют мои жесткие переносы.

Кажется, что ни таблицы в режиме org, ни babel в режиме org не могут этого сделать. Я не могу найти функцию elisp, которая делает эквивалент fill-paragraphстроки, например, в список. Это решило бы это.

1

3 ответа на вопрос

1
James Anderson

Надеюсь, я не правильно понял вопрос, но вот попытка:

Я начну с этого в организационной таблице:

#+BEGIN_SRC emacs-lisp (setq s1 "hello") (setq s2 " world") (setq s3 "!") (concat s1 s2 s3) #+END_SRC   #+RESULTS: : hello world! 

чтобы получить результаты, я поместил курсор в секцию SRC и вызвал функцию:

M+ x org-babel-execute-src-block

который для меня сопоставлен с сочетанием клавиш CTRL+ c CTRL+ c(сопоставление по умолчанию)

он запрашивает подтверждение для запуска команды. Или я неправильно понял требования? elisp должен работать с emacs без установки чего-либо (для python, JS вам придется установить вещи).

Спасибо, что ответили. Не совсем. У меня есть отдельные блоки типа `text`, которые я собираю вместе со ссылками` noweb`. Идея состоит в том, что я могу повторно использовать блоки `text` в отдельных местах. alyssackwan 5 лет назад 0
0
James Anderson

Ах! грамотное программирование. Я думал, что это был чистый вопрос режима организации. Это может помочь:

#+NAME: getString1 #+BEGIN_SRC text "do your homework" #+END_SRC  #+NAME: getString2 #+BEGIN_SRC text "if you want to learn computer science" #+END_SRC  #+NAME: getString3 #+BEGIN_SRC text "as well as Prof. D. Knuth" #+END_SRC  #+NAME: elispProg #+BEGIN_SRC elisp :noweb yes (concat <<getString1>> " " <<getString2>> " " <<getString3>>) #+END_SRC  #+RESULTS: elispProg : do your homework if you want to learn computer science as well as Prof. D. Knuth  #+NAME: pythonProg #+BEGIN_SRC python :noweb yes return "{} {} {}".format(<<getString1>>, <<getString2>>, <<getString3>>) #+END_SRC  #+RESULTS: pythonProg : do your homework if you want to learn computer science as well as Prof. D. Knuth 

В этом примере есть три строки (называемые «текст») и два примера программ, которые используют эти строки. Вы можете увидеть шаблон на описании типа. Некоторые вещи - это «текст», «elisp» и python. elisp и python - два разных языка программирования. Если вы поместите курсор в раздел с именем elispProg или pythonProg и сделаете CTRL+ c CTRL+c(он же org-babel-execute-src-block) вы должны увидеть результаты. Флаг в разделах кода «: сейчас да» взят из документации в редакторе emacs: «Расширение ссылок на синтаксис Noweb в теле блока кода src при оценке, запутывании или экспорте». Профессор Кунт - слово «запутывание» для обозначения разделов кода. Короче говоря, двойная «<<» ссылается на другие блоки и расширяется, если присутствует флаг «: сейчас да». Вы можете точно контролировать, что происходит, когда происходит оценка (блок exec src). Вот документы: https://www.gnu.org/software/emacs/manual/html_node/org/noweb.html

Спасибо. Я отредактировал свой оригинальный пост более подробно. alyssackwan 5 лет назад 0
0
James Anderson

Я вижу, что я неправильно понял проблему. Вот еще одна попытка. Это немного быстро / хакерский, но, похоже, работает. Это просто копирование длинной конкатенированной строки в буфер tmp, отмечающий весь буфер, вызывая fill-абзац, помещая результат в кольцо клипов и затем возвращая отформатированную строку. Так что теперь это просто fill-абзац, который потребляет строку, форматирует ее и возвращает отформатированную строку.

(setq noNewlines "This is a string that is way too long to be on one line. The point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block.")  (setq newLines "This is also a string that is way too long to be on one line. Again, the point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block.")  (setq my-paragraph (concat noNewlines newLines))  (defun wrap-string (str) "here we are going to wrap a long string so that is a nicely formatted paragraph" (interactive) (save-excursion (let* ((buf-name "*tmp-fill-paragraph*") (buffer (get-buffer-create buf-name)) (result)) (set-buffer buffer) (erase-buffer) (insert str) (mark-whole-buffer) (fill-paragraph) (copy-region-as-kill (point-min) (point-max)) (kill-buffer buf-name) (car kill-ring-yank-pointer) )))  (wrap-string my-paragraph) 

вот что я вижу в результате:

Похожие вопросы