使用换行符定义组织模式宏

时间:2014-03-02 19:55:12

标签: org-mode

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

我的动机是将宏扩展为包含两段的文本块。

4 个答案:

答案 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(如果需要在编写文档后进行自定义)。