Emacs Org-mode Babel:“Tangle”到结果块

Emacs Org-mode Babel:“Tangle”到结果块

我想使用 org-mode 通过连接片段来计算长段落。

我对非 Babel 方法持开放态度。我想到过表格,但我不知道如何从表格外部引用单元格,从而导入单元格内容,而不仅仅是链接到单元格内容。

使用 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.")

注意每个文本块中的非终端行没有双引号或右括号。这显然是格式错误的 elisp。

再说一遍,我不在乎这是怎么做到的。我只希望能够计算长文本段落,使其能够很好地换行或保留我的硬换行。

似乎 org-mode 表格和 org-mode babel 都无法做到这一点。我找不到一个 elisp 函数可以对fill-paragraph字符串执行与列表等同的操作。这可以解决这个问题。

答案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 CTRLc

它要求确认运行命令。还是我误解了要求?elisp 应该可以与 emacs 一起使用而无需安装任何东西(对于 python、JS,您必须安装一些东西)。

答案2

啊!文学编程。我以为这是一个纯粹的 org-mode 问题。这可能会有所帮助:

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

在这个例子中,有三个字符串(称为“text”)和两个使用这些字符串的程序示例。您可以在类型描述中看到模式。有些东西是“text”、“elisp”和 python。elisp 和 python 是两种不同的编程语言。如果您将光标放在名为 elispProg 或 pythonProg 的部分中并执行 + CTRL+ c CTRLc又名 org-babel-execute-src-block),您应该会看到结果。代码部分“:now yes”中的标志来自 emacs 编辑器中的文档:“在评估、缠结或导出时,在‘src’代码块主体中扩展 Noweb 语法引用”。缠结是 Kunth 教授对运行代码部分的称呼。长话短说,双“<<”引用其他块并在存在标志“:now yes”时展开。您可以精确控制评估(执行 src 块)时发生的情况。以下是文档: https://www.gnu.org/software/emacs/manual/html_node/org/noweb.html

答案3

我发现自己误解了这个问题。这是另一种尝试。它有点快速/黑客,但似乎有效。它只是将长连接字符串复制到标记整个缓冲区的临时缓冲区中,调用 fill-paragraph,将结果放到剪辑环上,然后返回格式化的字符串。所以现在它只是 fill-paragraph 使用一个字符串,格式化它并返回格式化的字符串。

(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)

这是我所看到的结果: 在此处输入图片描述

相关内容