จุดหลักคือว่ามีความแตกต่างระหว่างการทำงานและคำสั่ง
ในเสียงกระเพื่อม Emacs ฟังก์ชั่นจะไม่สามารถเรียกร้องได้โดยการโต้ตอบ ซึ่งหมายความว่าคุณไม่สามารถเข้าถึงผ่านM-x
หรือผูกไว้กับคีย์หรือการคลิกเมาส์ หากคุณต้องการทำเช่นนั้นคุณต้องประกาศฟังก์ชั่นให้ชัดเจนinteractive
ซึ่งคุณทำได้โดยการเพิ่ม(interactive)
ฟอร์มเป็นบรรทัดแรกในเนื้อความ (ตามด้วยสตริงเอกสารประกอบ) ฟังก์ชั่นการโต้ตอบที่เรียกว่าคำสั่งนี้จะอธิบายในคู่มือการ: (ฉบับออนไลน์)(info "(elisp) Using Interactive")
เกิดข้อผิดพลาดที่คุณเห็นWrong type argument: commandp, my-function
จะแสดงให้เห็นว่าคุณกำลังพยายามที่จะเรียกฟังก์ชั่นการโต้ตอบ แต่ฟังก์ชั่นที่ไม่ได้เป็นคำสั่ง
เพื่ออธิบายข้อผิดพลาดที่เกิดขึ้นจริงจดหมายp
มักใช้ในเสียงกระเพื่อมเพื่อระบุภาคแสดงหรือการทดสอบ ในกรณีนี้ Emacs กำลังทดสอบmy-function
เพื่อดูว่าเป็นคำสั่งที่ใช้การทดสอบcommandp
หรือไม่ ไม่ใช่ซึ่งนำไปสู่ข้อผิดพลาด ข้อผิดพลาดที่คล้ายกันปรากฏขึ้นเมื่อใดก็ตามที่คุณใช้วัตถุชนิดที่ไม่ถูกต้องถ้า Emacs คาดสตริงและคุณผ่านสัญลักษณ์คุณอาจเห็นการอ้างอิงถึงstringp
ยกตัวอย่างเช่น
ในการตอบคำถามตามที่ถามคุณจะต้องเพิ่ม(interactive)
บรรทัดลงในคำจำกัดความ:
(defun my-function ()
(interactive)
(message "This is a great function"))
มีเป็นจำนวนมากของตัวเลือกสำหรับinteractive
รูปแบบการสนับสนุนทุกชนิดของวิธีการส่งผ่านข้อมูลไปยังการทำงานของคุณ ตรวจสอบคู่มือสำหรับรายละเอียดทั้งหมด
แมโครคีย์บอร์ดเป็นกรณีพิเศษในบริบทนี้ มาโครคีย์บอร์ดคือลำดับเหตุการณ์การป้อนข้อมูลแสดงเป็นสตริง มาโครคีย์บอร์ดทำงานเหมือนคำสั่งดังนั้นคุณสามารถผูกมันไว้กับคีย์ได้โดยไม่ต้องกังวลกับการเพิ่มการinteractive
ประกาศ ตัวอย่างเช่นในต่อไปนี้:
(global-set-key (kbd "C-c l") "λ")
"λ"
เป็นมาโครคีย์บอร์ดดังนั้นเราสามารถผูกมันไว้ได้C-c l
โดยไม่มีปัญหา หากเราพยายามทำสิ่งเดียวกันกับฟังก์ชั่นเราต้องแน่ใจว่ากำหนดฟังก์ชั่นเป็นinteractive
:
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ