จะทำการบันทึกแมโครของแป้นพิมพ์ INCOMPLETE ต่อได้อย่างไร?


10

กรณีใช้คลาสสิก:

  1. คุณเริ่มบันทึกแมโคร: C-x (
  2. helloคุณทำสิ่งบางอย่างสมมติว่า
  3. คุณเรียกใช้คำสั่งที่ส่งข้อผิดพลาดสมมติว่าC-g(เช่นคุณเรียกใช้โดยไม่ตั้งใจC-sและคุณต้องยกเลิกสิ่งนั้นด้วยC-gตอนนี้งานของคุณจะหายไป)

ตอนนี้การบันทึกของคุณจะหายไป

ฉันต้องการดำเนินการต่อที่ที่ฉันค้างไว้ก่อนที่ฉันจะรันคำสั่งที่ขัดจังหวะการบันทึกของฉัน ฉันดูC-h f start-kbd-macroแต่เขียนเป็นภาษา C ดังนั้นฉันจึงไม่สามารถปรับแต่งมันได้ ฉันยังตามล่าหาตัวแปรเช่นcurrent-kbd-macroกัน แต่ก็ไม่พบใครเลย

มันสามารถกู้คืนได้?

ปรับปรุง:

ฉันไม่สามารถคิดออกว่าทำไมC-u C-x (ไม่ได้ทำงานสำหรับฉัน C-gแต่ฉันได้ค้นพบว่ามันเป็นเพราะฉันถูกทดสอบด้วย

ปรากฎว่าC-gเป็นสิ่งพิเศษ - หากคุณทริกเกอร์ข้อผิดพลาดประเภทอื่นเช่น

C-x ( M-: (signal 'quit nil) 

จากนั้นจะหยุดการบันทึก แต่last-kbd-macroจะมี"M-: M-( signal 'quit nil"แต่ด้วย

C-x ( C-g

สิ่งนี้จะหยุดการบันทึกและละทิ้งทุกสิ่งที่บันทึกไว้ ในฐานะผู้ใช้ Cg-happy (เช่นเดียวกับเพื่อนของฉันอย่างน้อยสองคน) นี่เป็นความแตกต่างที่ค่อนข้างโชคร้าย ฉันพยายามแก้ไขkeyboard-quitแต่ไม่มีสิ่งใดที่ฉันสามารถทำได้

ดูเหมือนว่าวิธีเดียวที่จะกู้คืนนี้จะผ่านrecent-keysโดยอัตโนมัติและการหาที่เริ่มต้น kbd แมโคร (หรือคล้ายกัน) kmacro-edit-lossageถูกเรียกว่าในขณะที่

คำตอบ:


8

ฉันเริ่มการใช้งานที่นี่ซึ่งช่วยให้คุณC-x (สามารถresmacro-start-macroเชื่อม

ทีนี้สมมติว่าคุณผ่านมาโครไปครึ่งทางแล้วทำผิดพลาดและโดนC-gตัวอย่างเช่นคุณวิ่งไปC-sโดยไม่ตั้งใจดังนั้นคุณกดปุ่มC-gเพื่อยกเลิกมันหรือ w / e

C-x ( hello C-s C-g 

ตอนนี้ทำงานC-u C-x (ซึ่งจะแจ้งให้ใน minibuffer ด้วย:

เรียกคืนมาโครด้วย (RET: ดำเนินการต่อ DEL: ลบล่าสุด): h e l l o C-s

ดังนั้นคุณกดปุ่ม Backspace ( DEL) เพื่อลบC-sและRETดำเนินการต่อ ตอนนี้มันพูดว่า:

กำลังผนวกกับแมโคร kbd ...

และคุณสามารถดำเนินการต่อ

เบ็ดเสร็จ:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

สะดวกไม่มีสวิทช์บริบท keybindings ขั้นต่ำเพื่อให้บรรลุงานตัวเลขออกมาโดยอัตโนมัติที่แมโครของคุณเริ่มต้น (at C-x () (recent-keys)จาก


1
เฮ้นั่นฟังดูดีจริงๆ สนใจที่จะส่งเป็นแพทช์ให้กับ Emacs หรือไม่?
สเตฟาน

คุณสามารถทำเช่นนั้น / relicense ตามที่คุณต้องการ! ฉันจะลองใช้งานซักครู่หนึ่งก่อนที่จะประกาศที่ไหนก็ได้เพื่อให้ฉันรู้ว่ามันน่าเชื่อถือ ผู้ดูแลระบบของ Emacs อาจคิดว่ามันแฮ็คเกินไป ;-)
คริสโตเฟอร์เสร็จสิ้น

หากต้องการรวมไว้ใน Emacs เราจำเป็นต้องให้ผู้เขียนลงนามในเอกสารลิขสิทธิ์ (เอกสารฉบับเดียวกันจะครอบคลุมโหมดเทพแน่นอน)
สเตฟาน

ลิงก์ใช้งานไม่ได้แล้ว :(
DirtY iCE

2

ดำเนินการkmacro-start-macro-or-insert-counterด้วยคำนำหน้า ( C-u) เพื่อผนวกกับแมโครก่อนหน้า


2
docstring ไม่ได้พูดอย่างนั้น แต่คำนำหน้าหาเรื่องคู่ ( C-u C-u) ชุดทั้งAPPENDและNO-EXECข้อโต้แย้งstart-kbd-macroซึ่งจะช่วยให้คุณผนวกโดยไม่ต้องเล่นใหม่เริ่มต้นของมหภาคที่ห่างไกล ลักษณะการทำงานนี้จะถูกบันทึกไว้ในคู่มือการอย่างไร:(emacs) Basic Keyboard Macro
Phils

ลองสิ่งนี้กับตัวอย่างในคำถามของฉันไม่ทำงาน
Christopher เสร็จ

2

การรวมคำตอบที่ดีจาก stsquad และ artagnon ทำให้ (ในใจของฉัน) เป็นคำตอบที่สมบูรณ์สำหรับปัญหาที่สมเหตุสมผลทั้งหมด:

  • C-xC-keC-hl เพื่อแก้ไขแมโครที่สร้างขึ้นจากการสูญเสีย
  • แก้ไขแมโครเพื่อลดการบันทึกต้นฉบับ
  • C-cC-c เพื่อจัดเก็บแมโครที่แก้ไข
  • อย่างใดอย่างหนึ่งC-u<f3>ที่จะเล่นแรกแมโครที่แล้วยังคงบันทึกการกดแป้นพิมพ์ที่ตามมาซึ่งจะถูกผนวกเข้ากับคำนิยามแมโคร
  • ... หรือC-uC-u<f3>บันทึกต่อไปโดยไม่ต้องเล่นซ้ำครั้งแรกของมาโคร

บางทีความจำเป็นในการแก้ไข lossage-as-macro อาจไม่เหมาะแต่ (a) คุณจำเป็นต้องแก้ไขแมโครโดยไม่คำนึงว่าหากคุณยกเลิกการบันทึกและ (b) สิ่งนี้ไม่ควรเกิดขึ้นบ่อยนัก ถ้าคุณจำวิธีหยุดแมโครได้ตามปกติ (เช่นมี<f4>มากกว่าC-g)

ไม่มีสิ่งใดที่จะบอกได้ว่ามันจะไม่เป็นประโยชน์ถ้าแมโครที่ถูกยกเลิกถูกเก็บไว้ที่ใดที่หนึ่ง; เป็นเพียงว่าฉันไม่คิดว่ามันจะเกิดขึ้นจริง มันอาจจะคุ้มค่าที่M-x report-emacs-bugจะแนะนำคุณสมบัตินี้


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

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

0

โซลูชันแบบบัญญัติคือC-x C-k C-e( kmacro-edit-macro) ซึ่งจะช่วยให้คุณสามารถผ่านแต่ละปุ่มกดและแทรก / ลบสิ่งที่คุณต้องการ ไวยากรณ์คำสั่งสำหรับตัวแก้ไขเป็นเรื่องย่อเล็กน้อย แต่?จะนำแนวทางขึ้นมา มีตัวแก้ไขที่เป็นธรรมชาติมากกว่าผูกกับC-x C-k e( edit-kbd-macro) ซึ่งให้ตัวแก้ไขแมโครข้อความธรรมดาพร้อมคำอธิบาย

อีกตัวเลือกหนึ่งM-x insert-kbd-macroที่จะช่วยให้คุณแก้ไขแมโครเป็นเสียงกระเพื่อม แต่ไม่ใช่สิ่งที่อ่านได้มากที่สุดในโลก

เท่าที่เป็นตัวแปรที่มีความกังวลคุณกำลังมองหาและlast-kbd-macrokmacro-ring

เมื่อคุณพูดถึงว่าคุณยังไม่เสร็จแมโครคุณก็แค่สร้างมันขึ้นมาจากการสูญเสียของคุณ C-x C-k e C-h lและลบอักขระก่อนหน้าสูงสุด 300 ตัว


นี่คือคำตอบที่ไม่ดีฉันจะลงคะแนนถ้าฉันสามารถทำได้ คุณไม่ได้อ่านคำถามหรือเพิกเฉย ทั้งlast-kbd-macroมิได้kmacro-ringมีปุ่มกดก่อนC-gหรือข้อผิดพลาดที่เกิดขึ้น ฉันใส่ INCOMPLETE ลงในแคปทั้งหมดในชื่อของฉันเพื่อคาดหวังคำตอบที่ไม่ดี ขอบคุณที่พยายามช่วย
คริสโตเฟอร์เสร็จ

1
@ChristopherDone: คุณทำได้ - ฉันได้เพิ่มข้อความที่ด้านล่างเพื่อพูดถึงการสูญเสีย คุณสามารถสร้างมาโครได้สูงสุด 300 ตัวอักษรที่คุณพิมพ์ไว้ก่อนหน้านี้
stsquad

ใช่มีคนพูดถึงการสูญเสียใน #emacs ฉันแค่ต้องการกลับมาทำงานต่อที่ที่ฉันค้างไว้ ฉันไม่ต้องการที่จะเปิดตัวแก้ไขและเริ่มลบสิ่งต่าง ๆ จากสิ่งนั้นเมื่อฉันกำลังทำอะไรบางอย่าง
Christopher เสร็จ

2
การรวมกันของนี้และ artagnon ของคำตอบให้แก้ปัญหาดี: C-x C-k e C-h lแก้ไขC-c C-cแล้วC-u f3จะดำเนินการในการบันทึก (สังเกตว่าที่ผ่านมาf3ในตอนแรกจะเล่นการป้อนข้อมูลเพิ่มเติมมหภาคจึงไกลก่อนที่จะรอ) บางทีความจำเป็นในการแก้ไข lossage-as-macro อาจไม่เหมาะแต่ (a) คุณจำเป็นต้องแก้ไขแมโครโดยไม่คำนึงถึงหากคุณยกเลิกการบันทึกและ (b) สิ่งนี้ไม่ควรเกิดขึ้นบ่อยนัก ถ้าคุณจำวิธีหยุดแมโครได้ตามปกติ
phils

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