1

Я хочу использовать 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 для строки, например, в список. Это решило бы это.

3 ответа3

1

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

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

#+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 вам придется установить вещи).

0

Я вижу, что я неправильно понял проблему. Вот еще одна попытка. Это немного быстро / хакерский, но, похоже, работает. Он просто копирует длинную каскадную строку в буфер 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)

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

0

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

#+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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .