此解决方案无需进行任何更改init.el
(只需进行少量修改)。尽管它涉及文件本地评估-但这正是OP所要求的。该解决方案的优点是:
- 要求确认以评估代码
- elisp代码可以在org-babel环境中进行编辑和测试
- 由于该解决方案不需要修改
init.el
orgmode文件,因此可以在(可信)用户之间共享
我在这里改写解决方案。
在文件中的某处添加一个src块:
#+NAME: startup
#+BEGIN_SRC emacs-lisp
(your-code-here)
#+END_SRC
然后,将其放在orgmode文件的末尾:
# Local Variables:
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:
添加(outline-hide-sublevels 1)
是因为我想将src块隐藏在标题中,并希望在启动时隐藏子级别。没有此声明,子级别将由扩展(org-babel-goto-named-src-block "startup")
。
使用此解决方案,emacs将询问两次执行许可(第一个:应用本地变量;第二个:执行“ startup” -src-block)。由于我的文件中包含许多src块,因此我设置了另一个file-local-variable org-confirm-babel-evaluate
,如下所示:
# Local Variables:
# org-confirm-babel-evaluate: nil
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:
警告:添加此命令后,emacs将仅提示一次执行权限- 该文件中的所有src块现在都可以执行而无需进一步确认。正如其他人之前指出的那样,此行为可能很危险,因此使用此设置时应格外小心。
但是,我认为这种解决方案(尤其是第一个版本)比Joe Corneli提供的解决方案更安全,因为至少会要求您确认执行。如果在文件中找到特殊块,Joe的解决方案将评估该特殊块,而无需确认。当然,攻击者必须猜测特殊块的名称...
我正在使用这种方法来编写大型文档,这些文档需要例如适应org-export机制。