นิยามมาโคร

Aug 21 2020

ฉันกำลังดำเนินการ "modularizing" ไฟล์ config ของฉันและพบปัญหาเกี่ยวกับมาโคร elisp

เนื่องจากวิธีที่ฉันกำหนดโมดูลการกำหนดค่าของฉันฉันจึงได้บล็อกโค้ดมากมายดังต่อไปนี้:

(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))

เนื่องจากฉันทำซ้ำบ่อยมากฉันจึงพยายามกำหนดมาโครเพื่อให้มีไฟล์กำหนดค่าที่อ่านได้มากขึ้น นี่เป็นครั้งแรกของฉันที่เขียนมาโครใน elisp ดังนั้นนี่คือสิ่งที่ฉันลงเอยด้วย:

(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))

ฉันพยายามเรียกมันด้วย

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

แต่มันไม่ได้ผล

ฉันทำอะไรผิดที่นี่?

คำตอบ

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpเป็นเพื่อนของคุณ. จะแสดงโค้ดที่มาโครของคุณกำลังขยายซึ่ง ได้แก่ :

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

ซึ่งบอกให้ Emacs ประเมินตัวแปรfuncs(ซึ่งอาจไม่มีอยู่จริง) ควรโหลดไลบรารี</path/to/current/default-directory>/latex.el</value/of/j/config-path>(ซึ่งดูเหมือนจะไม่น่าเกิดขึ้นเลย)

@ q.undertow ได้ครอบคลุมการconcatใช้งาน

สำหรับส่วนที่เหลือคุณอาจต้องการแยก&restอาร์กิวเมนต์ของคุณเข้ากับมาโครขยายด้วย,@funcs?

ดูC-hig (elisp)Backquoteข้อมูลเพิ่มเติมเกี่ยวกับการต่อเชือก

3 q.undertow Aug 21 2020 at 09:02

สำหรับสิ่งหนึ่ง (และฉันไม่แน่ใจว่าไม่มีปัญหาอื่น) การเรียกไปยังexpand-file-nameในเนื้อหามาโครจะถูกรบกวน มันควรจะเป็น

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

นอกจากนี้คุณอาจต้องการประเมินการเรียงต่อกันในเวลาขยายแมโคร:

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

หวังว่านี่จะช่วยได้