จะบันทึกมาโครคีย์บอร์ดเป็นฟังก์ชั่น Lisp ได้อย่างไร?


41

บ่อยมากฉันจะต้องดำเนินการตามขั้นตอนที่ต้องใช้หลายจังหวะกุญแจ สำหรับเซสชั่นเดียวกันขั้นตอนเหล่านั้นสามารถบันทึกในแมโครแป้นพิมพ์

ตัวอย่างคือการบันทึกการดำเนินการค้นหา / แทนที่ที่ดำเนินการบ่อยเป็นแมโครแป้นพิมพ์ แต่มาโครนั้นจะหายไปเมื่อฉันออกจาก emacs

ฉันจะบันทึกแมโครคีย์บอร์ดที่ใช้บ่อยเป็นฟังก์ชั่น Lisp ได้อย่างไร?

เพื่อความเรียบง่ายฉันต้องการบันทึกการกระทำของการแทนที่ "abc" ด้วย "def" เป็นฟังก์ชันเพื่อให้ฉันสามารถนำมันกลับมาใช้ใหม่ในเซสชัน emacs ได้

คำตอบ:


48

นี่คือขั้นตอนที่คุณสามารถทำตาม:

  • เลือกภูมิภาคที่คุณต้องการเปลี่ยนการค้นหา
  • เริ่มบันทึกมาโคร

    M-x start-kbd-macro

  • ทำสิ่งที่ต้องการM-x query-replace-regexp(แทนที่ "abc" ด้วย "def") และใช้!เพื่อบังคับให้ค้นหา - แทนที่ในพื้นที่ทั้งหมด
  • หยุดการบันทึกมาโคร

    M-x kmacro-end-or-call-macro.

  • ทำและให้แมโครชื่อที่อธิบายเช่นM-x kmacro-name-last-macro จากนั้นคุณจะสามารถที่จะเรียกมาโครนั้นอีกครั้งด้วยการทำreplace-abc-with-defM-x replace-abc-with-def
  • ตอนนี้ให้บันทึกมาโครนี้เป็นฟังก์ชั่นไปยังไฟล์ที่คุณโหลดระหว่างการเริ่มต้น emacs init.elยกตัวอย่างเช่น
    • M-x insert-kbd-macro
    • เลือกแมโครที่มีชื่อของคุณเพื่อแทรกที่นั่น

replace-abc-with-defนิยามฟังก์ชันที่สร้างขึ้นอัตโนมัติมีลักษณะดังนี้:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

ตอนนี้คุณสามารถทำได้M-x replace-abc-with-defในทุกช่วง emacs ของคุณ


1
+1 insert-kbd-macroสำหรับ นั่นคือคำตอบสำหรับคำถาม (และส่วนที่เหลือของคำตอบนี้ให้ความช่วยเหลือเพิ่มเติม)
ดึง

6
โปรดทราบว่า Emacs สามารถสร้างรูปแบบที่แตกต่างกันสองรูปแบบสำหรับคีย์บอร์ดมาโคร ที่หนึ่งที่คุณได้รับเมื่อคุณinsert-kbd-macroขึ้นอยู่กับว่าคุณจะตั้งชื่อมันใช้kmacro-name-last-macro(ในขณะที่คำตอบข้างต้น) name-last-kbd-macroหรือ
phils

1
โปรดทราบว่าหากคุณใช้name-last-kbd-macroรูปแบบ (ดังที่ @phils ด้านบน) แสดงว่าคุณใช้สตริงไม่ใช่ฟังก์ชัน fsetการกำหนดให้กับสัญลักษณ์ช่วยให้คุณสามารถเรียกใช้แมโครโดยใช้ Mx แต่ไม่เรียกว่าจาก lisp ( commandp-> t, functionp-> nil) แปลกแม้การโทรผ่านcall-interactivelyจะไม่ทำงาน (แม้ว่าคุณสามารถใช้execute-kbd-macroเพื่อเรียกใช้)
pyrocrasty

24

Elmacroได้รับการกล่าวถึงแล้วโดย @lunaryorn แต่ในฐานะผู้เขียนแพ็คเกจนี้ฉันคิดว่ามันคงจะดีถ้าได้เป็นตัวอย่าง

หากคุณบันทึกมาโครเช่นนี้:

F3 C-e M-b M-u C-a C-n F4

จากนั้นการM-x elmacro-show-last-macro upcase-last-wordสร้างบัฟเฟอร์ด้วย:

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))

17

elmacroM-x elmacro-show-last-macroแพคเกจช่วยให้คุณดูแมโครที่บันทึกที่ผ่านมาเป็นที่เหมาะสมกับ Emacs เสียงกระเพื่อม


7
มีคนแนะนำแพ็คเกจของฉัน \ o /
Silex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.