นิยามมาโคร
ฉันกำลังดำเนินการ "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))
แต่มันไม่ได้ผล
ฉันทำอะไรผิดที่นี่?
คำตอบ
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ข้อมูลเพิ่มเติมเกี่ยวกับการต่อเชือก
สำหรับสิ่งหนึ่ง (และฉันไม่แน่ใจว่าไม่มีปัญหาอื่น) การเรียกไปยังexpand-file-nameในเนื้อหามาโครจะถูกรบกวน มันควรจะเป็น
(expand-file-name (concat ,module ".el") j/config-path)
นอกจากนี้คุณอาจต้องการประเมินการเรียงต่อกันในเวลาขยายแมโคร:
(expand-file-name ,(concat module ".el") j/config-path)
หวังว่านี่จะช่วยได้