【发布时间】:2014-04-18 12:36:30
【问题描述】:
我正在 org 模式下开发一个识字程序。我的 .emacs 中有几个函数用于为程序设置 repl,是否可以将这些函数移动到 org-mode 文件并在每次打开文件时对其进行评估(如缓冲区本地变量,但使用功能。)
【问题讨论】:
标签: emacs org-mode literate-programming org-babel
我正在 org 模式下开发一个识字程序。我的 .emacs 中有几个函数用于为程序设置 repl,是否可以将这些函数移动到 org-mode 文件并在每次打开文件时对其进行评估(如缓冲区本地变量,但使用功能。)
【问题讨论】:
标签: emacs org-mode literate-programming org-babel
您应该可以使用特殊的 eval file-local variable 来做到这一点(强调我的):
一些“变量名”在局部变量列表中具有特殊含义:
mode启用指定的主要模式。eval计算指定的 Lisp 表达式(忽略该表达式返回的值)。coding指定此文件字符编码转换的编码系统。见Coding Systems。unibyte表示以单字节模式加载或编译 Emacs Lisp 文件,如果值为t。见Disabling Multibyte。
因此,例如,具有此第一行的 Org 文件
# -*- eval: (message "foo"); -*-
或文件最后 3000 个字符内的类似块
# Local Variables:
# eval: (message "foo")
# End:
将在打开文件时评估(message "foo")。
这是一个安全风险,所以当你打开文件时会提示你。您可以使用y 对其进行一次评估,或使用! 将其作为安全评估保存在您的自定义文件中并避免将来出现提示。
编辑:
这有点尴尬,但这是一种在文件加载时评估命名源块的方法:
# -*- eval: (progn (org-babel-goto-named-src-block "foo") (org-babel-execute-src-block-maybe)) -*-
#+NAME: foo
#+BEGIN_SRC emacs-lisp :results silent
(message "Yes, it worked")
#+END_SRC
不幸的是,我没有看到任何直接调用命名块的方法,这样您会收到两次安全提示:一次用于eval,一次用于代码块@987654337 @。
【讨论】:
# -*- eval: (progn (org-babel-goto-named-src-block "foo") (org-babel-execute-src-block-maybe)) -*- 可以替换为# -*- eval: (org-sbe "foo") -*-