使用Org Babel纠缠为变量文件名


16

如果我有一个缠结到文件的代码片段,但是我希望文件名会随着时间变化,那么是否有比Query-replace更干净的方法来更改文件名?

例如,说我将代码纠缠到〜/ dir / my-file.el:

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my-file.el
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my-file.el
(defun foo (bar) ... )
#+END_SRC

etc.

后来我意识到该文件最好放在另一个位置:

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my/file.el
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle ~/dir/my/file.el
(defun foo (bar) ... )
#+END_SRC

etc.

有没有办法将参数动态更改为:tangle。

我已经调查并发现,我可以将elisp输入到:tangle参数中。如果我评估(setq myfile "~/dir/file.el)然后纠结以下内容:

#+BEGIN_SRC emacs-lisp :tangle (print myfile)
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle (print myfile)
(defun foo (bar) ... )
#+END_SRC

我得到想要的结果。然后,我可以执行一个elisp片段以使用org-babel设置变量,但是我想知道是否有一种更干净的方法。

:tangle标头上的文档未规定本机方式。

Answers:


17

您不应该重复这样的事情,而应该在一处定义它们。例如,您可以在抽屉中将输出文件定义为整个树和子树的标头args

* Header
:PROPERTIES:
:tangle: ~/dir/my/testfile.el
:END:

:dir

* Header
:PROPERTIES:
:header-args: :dir ~/dir/my/dir/
:END:

文档所述,您可以:

  • 系统范围的标头参数
  • 特定于语言的标头参数
  • 组织模式属性中的标题参数
  • 组织模式属性中特定于语言的标头参数
  • 代码块特定的标头参数
  • 函数调用中的标题参数

1

您可以使用org标题的属性代替 setq

* Header
:PROPERTIES:
:PRJ-DIR: ~/prj/dir/
:END:

#+BEGIN_SRC emacs-lisp :tangle (concat (org-entry-get nil "PRJ-DIR" t) "file.el")
(setq myvar1 "value1")
#+END_SRC

#+BEGIN_SRC emacs-lisp :tangle (concat (org-entry-get nil "PRJ-DIR" t) "file.el")
(defun foo (bar) ... )
#+END_SRC

etc.

这样,您可以为每个源块设置不同的文件名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.