#+BIND:如何真正起作用

Bru*_*ILS 6 emacs org-mode

#+BIND:org-mode(9.0.3) 中的机制完全混淆了。

我需要修复一些没有特定关键字的设置,并且我希望我的 org 文件是可移植的(不想对人们的 emacs init 文件进行更改,我将发送它)。

因此,我更改了org-export-allow-bind-keywordswith 文件局部变量并尝试通过该#+BIND:机制修复所需的 emacs 变量。

看来指定的变量不绑定在所有

为了了解绑定是否完成,我尝试使用以下示例在导出期间打印变量的内容:

#+BIND: myvar " middle "

#+BEGIN_SRC emacs-lisp :results value :exports results
(concat "before" myvar "after")
#+END_SRC

# Local Variables:
# org-export-allow-bind-keywords: t
# End:
Run Code Online (Sandbox Code Playgroud)

当然,在打开文件之前myvar,我通过(setq myvar " empty ").

导出时,我没有得到预期值before middle after,而是以下值:before empty after.

知道我错过了什么吗?

Nic*_*ckD 6

这并不是一个完整的答案:#+BIND 有一些微妙之处。但上述示例不起作用的基本原因是,在导出期间甚至使用 #+BIND 构造之前,已完成对源块的评估。查看函数org-export-as(在文件 lisp/ox.el 中):在第 3061 行,org-babel-exp-process-buffer调用函数来处理源块;#+BIND 构造用于org-export-get-environment, 在第 3078 行 - 即在处理源块之后。(行号来自我的版本 9.0.3+,所以它们应该很接近,但对于最近版本的 org 可能不一样)。

#+BIND 构造从来都不是在导出期间绑定任意变量的机制:有一些影响导出的缓冲区内设置和一些无法在缓冲区中设置的设置,但人们想对每个文件进行调整,而不是必须全局设置它们(然后可能必须在导出后取消设置)。所以 Carsten Dominik(org-mode 的创建者)添加了一些,但后来决定创建更通用的机制,这样他就不必继续添加缓冲区内设置。总的来说,我认为 #+BIND 不再特别有用:导出机制已经发生了巨大变化,以至于几乎无关紧要。

更新:这是做你想做的一种方法:

#+name: myvar
#+BEGIN_SRC emacs-lisp
" middle "
#+END_SRC

#+BEGIN_SRC emacs-lisp :var x=myvar :results value :exports results
(concat "before" x "after")
#+END_SRC
Run Code Online (Sandbox Code Playgroud)