Makrodefinition

Aug 21 2020

Ich bin dabei, meine Konfigurationsdatei zu "modularisieren" und bin auf ein Problem mit Elisp-Makros gestoßen.

Aufgrund der Art und Weise, wie ich meine Konfigurationsmodule definiere, erhielt ich eine Reihe von Codeblöcken wie folgt:

(with-eval-after-load (expand-file-name
                       "latex.el"
                       j/config-path)
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

Da ich das oft wiederholt habe, habe ich versucht, ein Makro zu definieren, um besser lesbare Konfigurationsdateien zu erhalten. Es ist mein erstes Mal, dass ich Makros in elisp schreibe, also kam ich zu folgendem Ergebnis:

(defmacro j/con-load (module &rest funcs)
      "TODO doc goes here"
      `(with-eval-after-load
           (expand-file-name (concat ,module ".el" j/config-path))
         funcs))

Ich versuche es mit zu nennen

(j/con-load "latex"
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

aber es funktioniert einfach nicht.

Was mache ich hier falsch?

Antworten

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpist dein Freund. Es zeigt Ihnen den Code, in den Ihr Makro erweitert wird:

(with-eval-after-load
    (expand-file-name
     (concat "latex" ".el" j/config-path))
  funcs)

Dadurch wird Emacs angewiesen, die Variable auszuwerten funcs(die wahrscheinlich nicht vorhanden ist), falls jemals eine Bibliothek geladen wird </path/to/current/default-directory>/latex.el</value/of/j/config-path>(was eher unwahrscheinlich erscheint).

@ q.undertow hat die concatNutzung abgedeckt .

Für den Rest, Sie wollten wahrscheinlich splice Ihr &restmit dem Argument in den erweiterten Makro ,@funcs?

Sehen Sie C-hig (elisp)Backquotefür weitere Informationen Spleißen.

3 q.undertow Aug 21 2020 at 09:02

Zum einen (und ich bin mir überhaupt nicht sicher, ob es kein anderes Problem gibt) wird der Aufruf von expand-file-nameim Makrokörper verschlüsselt. Es sollte sein

(expand-file-name (concat ,module ".el") j/config-path)

Möglicherweise möchten Sie auch die Konzentration zur Makroerweiterungszeit bewerten:

(expand-file-name ,(concat module ".el") j/config-path)

hoffe das hilft