#+ BIND:真的有用吗?

时间:2017-01-31 18:17:48

标签: emacs org-mode

我对#+BIND:(9.0.3)中的org-mode机制感到困惑。

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

因此,我使用文件局部变量更改org-export-allow-bind-keywords,并尝试通过#+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:

当然在打开文件之前,我通过myvar在我的emacs init文件中将初始值修改为(setq myvar " empty ")

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

知道我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

这并不是一个完整的答案:#+ 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构造从未被视为在导出期间绑定任意变量的机制:有一些缓冲区设置会影响导出,而某些设置无法在缓冲区中设置,但是人们想要调整它们-file,而不是必须全局设置它们(然后可能必须在导出后取消设置它们)。因此,Carsten Dominik(组织模式的创建者)增加了一些,但随后决定创建更通用的机制,这样他就不必继续添加缓冲区设置。一般来说,我认为#+ 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