Hi Tom, I have a patch that should fix your problems with some characters in macro expansions:
>From 27b22d17f629a50bd485a0320dac45616d7ceb7f Mon Sep 17 00:00:00 2001 From: Achim Gratz <strom...@stromeko.de> Date: Sun, 17 Mar 2013 10:20:10 +0100 Subject: [PATCH] fix macro expansion with separators and backslashes * lisp/org-element.el (org-element-macro-parser): Do not try to "repair bad splits", only split at the correct places. * lisp/org-macro.el (org-macro-expand): Do not try to interpret the macro replacement text as a regex. Allow to write macros like {{{kbd(\\)}}} and {{{kbd(\\,)}}} and expand them correctly. A backslash at the end of an argument was incorrectly trying to cons the next argument (which may not exist). --- lisp/org-element.el | 16 +++++----------- lisp/org-macro.el | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index ba2461a..337cad0 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -3117,20 +3117,14 @@ (defun org-element-macro-parser () (post-blank (progn (goto-char (match-end 0)) (skip-chars-forward " \t"))) (end (point)) - (args (let ((args (org-match-string-no-properties 3)) args2) + (args (let ((args (org-match-string-no-properties 3))) (when args ;; Do not use `org-split-string' since empty ;; strings are meaningful here. - (setq args (split-string args ",")) - (while args - (while (string-match "\\\\\\'" (car args)) - ;; Repair bad splits, when comma is protected, - ;; and thus not a real separator. - (setcar (cdr args) (concat (substring (car args) 0 -1) - "," (nth 1 args))) - (pop args)) - (push (pop args) args2)) - (mapcar 'org-trim (nreverse args2)))))) + (setq args (replace-regexp-in-string "," "\000" args)) + (setq args (replace-regexp-in-string "\\\\\000" "," args)) + (setq args (split-string args "\000")) + (mapcar 'org-trim args))))) (list 'macro (list :key key :value value diff --git a/lisp/org-macro.el b/lisp/org-macro.el index 88cbdf7..3e07295 100644 --- a/lisp/org-macro.el +++ b/lisp/org-macro.el @@ -137,7 +137,7 @@ (defun org-macro-expand (macro templates) (org-element-property :args macro)) ;; No argument: remove place-holder. "")) - template))) + template nil 'literal))) ;; VALUE starts with "(eval": it is a s-exp, `eval' it. (when (string-match "\\`(eval\\>" value) (setq value (eval (read value)))) -- 1.8.1.4
I hope Nicolas will apply it or make a better patch. The quoting used unfortunately is not idempotent, so you need to know how many times your macro will get expanded, but it is a start. You should now be able to do this:
>From 042ad50bd06cbc5ab97c753cb5cfce8908121242 Mon Sep 17 00:00:00 2001 From: Achim Gratz <strom...@stromeko.de> Date: Sun, 17 Mar 2013 11:27:21 +0100 Subject: [PATCH] put back macros with "problematic characters" --- orgmanual.org | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/orgmanual.org b/orgmanual.org index 6aa6b81..d50b20b 100644 --- a/orgmanual.org +++ b/orgmanual.org @@ -4254,13 +4254,10 @@ Priorities can be attached to any outline node; they do not need to be TODO items. #+attr_texinfo: :table-type table :indic @asis - - {{{kbd(C-c XXX)}}} :: + - {{{kbd(C-c \\,)}}} :: - {{{kindex(C-c ,)}}} - #+comment: {{{kindex(@kbd{C-c ,})}}} - #+comment: Preceding line won't export to pdf - {{{findex(org-priority)}}} - #+comment: Should be C-c , + {{{kindex(C-c \\,)}}} + {{{findex(org-priority)}}} Set the priority of the current headline (~org-priority~). The command prompts for a priority character {{{samp(A)}}}, {{{samp(B)}}} @@ -9226,9 +9223,7 @@ the other commands, the cursor needs to be in the desired line. - ~\~ ~org-agenda-filter-by-tag-refine~ :: - #+comment: {{{kindex(XXX)}}} - #+comment: Should be \ - @@info:kindex \\@@ + {{{kindex(\)}}} Narrow the current agenda filter by an additional condition. When called with prefix arg, remove the entries that /do/ have the tag, or @@ -9350,11 +9345,9 @@ the other commands, the cursor needs to be in the desired line. Set tags for the current headline. If there is an active region in the agenda, change a tag for all headings in the region. -- {{{kbd(,)}}} :: +- {{{kbd(\\,)}}} :: - #+comment: {{{kindex(XXX)}}} - #+comment: Should be a comma - @@info:kindex ,@@ + {{{kindex(\\,)}}} Set the priority for the current item (~org-agenda-priority~). Org mode prompts for the priority character. If you reply with @@ -10691,12 +10684,9 @@ If you would like to see entities displayed as UTF8 characters, use the following command:[fn:108] #+attr_texinfo: :table-type table :indic @asis -- @@info:@kbd{C-c C-x XXX}@@ :: - - #+comment: {{{kindex(C-c C-x XXX)}}} - #+comment: Should be \ +- {{{kbd(C-c C-x \)}}} :: - @@info:kindex C-c C-x \\ + {{{kindex(C-c C-x \)}}} Toggle display of entities as UTF-8 characters. This does not change the buffer content which remains plain ASCII, but it overlays the @@ -10740,9 +10730,7 @@ subscript, but ~a_{b}~ will. #+attr_texinfo: :table-type table :indic @asis - @@info:@kbd{C-c C-x \\}@@ :: - #+comment: {{{kindex(C-c C-x XXX)}}} - #+comment: Should be \ - @@info:@kindex C-c C-x \@@ + {{{kindex(C-c C-x \)}}} In addition to showing entities as UTF-8 characters, this command will also format sub- and superscripts in a WYSIWYM way. -- 1.8.1.4
Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ SD adaptations for Waldorf Q V3.00R3 and Q+ V3.54R2: http://Synth.Stromeko.net/Downloads.html#WaldorfSDada