2014-03-02 15 views
12

bricht Es ist möglich, define a macro in einer org Datei wie folgt:definieren org Makro-Modus mit Zeilen

#+MACRO: macroname <here comes the body of the macro> 

Ist es möglich, ein Makro zu definieren, die Zeilenumbrüche enthält? Das heißt, so etwas wie:

#+MACRO: macroname line 1 of macro 
        line 2 of macro 

Insbesondere wird dieser Makro auf

line 1 of macro 
line 2 of macro 

Meine Motivation erweitert werden soll, einen Makro haben, die zu einem Textblock erweitert, die enthalten zum Beispiel zwei Absätze .

Antwort

1

Momentan nicht mit Standardwerkzeugen möglich, da org-macro--collect-macros nur einlinige Definitionen betrachtet.

Hier ist ein Work-around:

* 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}}} 

Dieser Ansatz favorisiert Konvention über Anpassung, so dass jedes Makro hat ein Level-2 Kind Niveau zu 1 Überschrift mit dem Namen "Makros". Keine zusätzliche Konfiguration notwendig: Ein einfacher Export sollte funktionieren.

Die Setup-Überschrift sollte in Dateien kopiert werden, in denen dies funktionieren soll. Oder Sie können die defadvice zu Ihrer Konfiguration hinzufügen, um dieses Verhalten überall zu haben.

+0

Das kommt näher an, was ich will/muss, aber es ist sehr umständlich. Ich wünschte, es gäbe eine einfachere Lösung. – Dror

1

Der beste Rat, den ich Ihnen geben kann, ist: Folgen Sie, was von Nicolas Goaziou vorgeschlagen wird (d. H. Verwenden Sie keine Makros für Ihre Verwendung), und finden Sie eine andere Lösung, für die Sie sicher sind, dass es jetzt und für immer funktioniert.

In diesem Fall würde ich entweder YASnippets (wenn nur ein Helfer beim Tippen) oder Org Babel (wenn es nach dem Schreiben Ihres Dokuments angepasst werden muss).

+0

Ich habe 'foo.org' und' bar.org', so dass 'foo' in' bar' enthalten ist. Ich möchte jedoch etwas in "bar" definieren können, das eine Überschrift zu "foo" hinzufügen wird. Also denke ich, YAS ist keine Option. 'Babel' könnte sein .. – Dror

7

Nicht nur ist das möglich, es ist ziemlich einfach zu tun. Sie müssen nur kreativ darüber sein, wie Sie die Newline einfügen. Ich benutze Org Babel, um die Makros zu hacken. Die folgenden Werke für mich:

#+MACRO: newline src_emacs-lisp[:results raw]{"\n"} 
#+MACRO: macroname line 1 of macro {{{newline}}}line 2 of macro 

Also, dieses Dokument gegeben:

#+MACRO: newline src_emacs-lisp[:results raw]{"\n"} 
#+MACRO: macroname line 1 of macro {{{newline}}}line 2 of macro 

{{{macroname}}} 

Org-Modus exportieren gibt die folgende

# 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 

Sie müssen nur bewusst sein, dass einige Exportformate wandelt das newline in eine einzelne Zeile um, wenn es den Text umschließt. Also, Sie wollen wahrscheinlich so etwas, um zwei Absätze zu bekommen:

#+MACRO: newline src_emacs-lisp[:results raw]{"\n"} 
#+MACRO: macroname line 1 of macro {{{newline}}} {{{newline}}}line 2 of macro 
+0

das ist nett, aber erfordert, dass' {{{newline}}} 'whitespace vorangestellt wird. Sie können das Newline-Makro weiter als '@@ html: @@ src_emacs-lisp ...' hacken, um sicherzustellen, dass vor dem 'src_emacs-lisp'-Block ein Leerzeichen steht. – Mark

2

Es gibt eine andere Lösung, die scheint richtig zu funktionieren. Von org-Makro.el-Quellcode:

;; VALUE starts with "(eval": it is a s-exp, `eval' it. 
     (when (string-match "\\`(eval\\>" value) 
      (setq value (eval (read value)))) 

So können Sie Makro wie folgt definieren:

#+MACRO: newline (eval "\n") 

Auswechslungen werden ebenfalls unterstützt. Das Makro

#+MACRO: img (eval "#+CAPTION: $1\nfile:$2") 

die als

{{{img(hello world!, ./img1.jpg)}}} 

wird ersetzt mit genannt wird:

#+CAPTION: hello world! 
file:./img1.jpg 
Verwandte Themen