org
文件中的define a macro可能如下:
#+MACRO: macroname <here comes the body of the macro>
是否可以定义包含换行符的宏?即,像:
#+MACRO: macroname line 1 of macro
line 2 of macro
特别是,此宏将扩展为
line 1 of macro
line 2 of macro
我的动机是将宏扩展为包含两段的文本块。
答案 0 :(得分:9)
这不仅可行,而且非常容易。你只需要 关于如何插入换行符的创意。我利用Org Babel来破解宏。以下适用于我:
#+MACRO: newline src_emacs-lisp[:results raw]{"\n"}
#+MACRO: macroname line 1 of macro {{{newline}}}line 2 of macro
所以,鉴于此文件:
#+MACRO: newline src_emacs-lisp[:results raw]{"\n"}
#+MACRO: macroname line 1 of macro {{{newline}}}line 2 of macro
{{{macroname}}}
导出到组织模式提供以下内容
# Created 2015-11-03 Tue 15:27
#+TITLE:
#+AUTHOR:
#+MACRO: newline src_emacs-lisp[:results raw]{"\n"}
#+MACRO: macroname line 1 of macro {{{newline}}}line 2 of macro
line 1 of macro
line 2 of macro
您只需要知道某些导出格式会改变它 换行包装文本时换行到单行。所以,你可能想要这样的东西得到两段:
#+MACRO: newline src_emacs-lisp[:results raw]{"\n"}
#+MACRO: macroname line 1 of macro {{{newline}}} {{{newline}}}line 2 of macro
答案 1 :(得分:5)
还有另一种似乎正常工作的解决方案。来自org-macro.el源代码:
;; VALUE starts with "(eval": it is a s-exp, `eval' it.
(when (string-match "\\`(eval\\>" value)
(setq value (eval (read value))))
因此,您可以像这样定义宏:
#+MACRO: newline (eval "\n")
也支持替代。宏
#+MACRO: img (eval "#+CAPTION: $1\nfile:$2")
被称为
{{{img(hello world!, ./img1.jpg)}}}
将替换为:
#+CAPTION: hello world!
file:./img1.jpg
答案 2 :(得分:1)
目前使用标准工具是不可能的
org-macro--collect-macros
仅查看单行定义。
这是一个解决方法:
* Setup :noexport:
#+begin_src elisp :exports results :results silent
(setq my-macros
(mapcar
(lambda (x)
(string-match "\\*\\* \\([^\n]+\\)\n\\(.*\\)" x)
(cons (match-string 1 x)
(substring x (match-beginning 2))))
(org-element-map (org-element-parse-buffer) 'headline
(lambda (x)
(and (= (org-element-property :level x) 2)
(string=
(org-element-property
:raw-value
(org-element-property :parent x)) "Macros")
(buffer-substring-no-properties
(org-element-property :begin x)
(org-element-property :end x)))))
headings))
(defadvice org-macro--collect-macros (around add-macros activate)
(let ((r ad-do-it))
(setq ad-return-value
(append my-macros r))))
#+end_src
* Macros
** foobar
line 1 of macro
line 2 of macro
** bar
line 1 of macro
line 2 of macro
line 3 of macro
* Test
{{{foobar}}}
{{{bar}}}
这种方法优于常规而不是自定义,因此每个宏都有 级别为1的2级孩子,名称为#34;宏&#34;。 无需额外配置:普通导出应该有效。
应将“安装”标题复制到您希望其工作的文件中。
或者,您可以将defadvice
添加到配置中,以便在任何地方都能使用此行为。
答案 3 :(得分:1)
我能给你的最好的建议是:遵循Nicolas Goaziou的建议(即,不要使用宏),找到另一种解决方案,你确信它现在可以永久工作。< / p>
在这种情况下,我要么使用YASnippets(如果只是打字时的助手)或Org Babel(如果需要在编写文档后进行自定义)。