Làm cách nào để tiếp tục ghi lại macro bàn phím INCOMPLETE?


10

Trường hợp sử dụng cổ điển:

  1. Bạn bắt đầu ghi một macro: C-x (
  2. Bạn làm một số thứ, hãy nói hello.
  3. Bạn chạy một lệnh gây ra lỗi, giả sử C-g(ví dụ: bạn chạy nhầm C-svà bạn phải hủy lệnh đó C-g, bây giờ công việc của bạn bị mất).

Bây giờ ghi âm của bạn cho đến nay bị mất.

Tôi muốn tiếp tục nơi tôi rời đi trước khi tôi chạy một lệnh làm gián đoạn ghi âm của tôi. Tôi nhìn vào C-h f start-kbd-macro, nhưng nó được viết bằng C, vì vậy tôi không thể điều chỉnh nó. Tôi cũng đã săn lùng một biến như thế current-kbd-macro, nhưng không tìm thấy cho đến nay.

Nó có thể được phục hồi?

Cập nhật:

Tôi không thể hiểu tại sao tôi C-u C-x (không làm việc cho tôi, nhưng tôi đã phát hiện ra điều đó bởi vì tôi đang thử nghiệm C-g.

Hóa ra đó C-glà điều đặc biệt - nếu bạn kích hoạt một loại lỗi khác, vd

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

Sau đó, điều này sẽ dừng ghi âm, nhưng last-kbd-macrosẽ chứa "M-: M-( signal 'quit nil", nhưng với

C-x ( C-g

Điều này dừng ghi và loại bỏ bất cứ điều gì ghi lại. Là một người dùng hạnh phúc Cg (ít nhất là hai người bạn của tôi), đây là một sự khác biệt khá đáng tiếc. Tôi đã thử chỉnh sửa keyboard-quit, nhưng không có gì tôi có thể làm trong đó.

Có vẻ như cách duy nhất để khôi phục điều này là thông qua recent-keysvà tự động tìm ra nơi bắt đầu một macro-kbd-macro (hoặc tương tự), như trong kmacro-edit-lossage.

Câu trả lời:


8

Tôi đã bắt đầu thực hiện ở đây cho phép bạn rebind bạn C-x (đến resmacro-start-macro.

Bây giờ, giả sử bạn nhận được một nửa thông qua một macro và mắc lỗi và đánh C-g, ví dụ: bạn chạy C-sdo nhầm lẫn và do đó bạn nhấn C-gđể hủy bỏ nó, hoặc w / e.

C-x ( hello C-s C-g 

Bây giờ chạy C-u C-x (sẽ nhắc trong bộ thu nhỏ với:

Tiếp tục macro với (RET: continue, DEL: xóa lần cuối): h e l l o C-s

Vì vậy, bạn nhấn backspace ( DEL) để xóa C-svà sau đó RETtiến hành. Bây giờ nó nói:

Đang thêm vào macro kbd ...

Và bạn có thể tiếp tục.

Tổng cộng:

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!

Thuận tiện, không có chuyển đổi ngữ cảnh, tổ hợp phím tối thiểu để đạt được nhiệm vụ, tự động tìm ra macro của bạn bắt đầu (tại C-x () từ đâu (recent-keys).


1
Này, nghe có vẻ hay đấy. Muốn gửi nó như một bản vá cho Emacs?
Stefan

Bạn được chào đón để làm như vậy / relicense như bạn muốn! Tôi sẽ dùng thử một thời gian tại địa phương trước khi công bố nó ở bất cứ đâu, để tôi có thể biết nó đáng tin cậy. Những người bảo trì Emacs có thể nghĩ rằng nó quá hack, mặc dù. ;-)
Christopher Hoàn thành

Để đưa nó vào Emacs, chúng tôi cần tác giả ký giấy tờ bản quyền (tất nhiên giấy tờ cũng sẽ bao gồm chế độ thần, tất nhiên).
Stefan

Liên kết bị hỏng ngay bây giờ :(
DirtY iCE

2

Thực thi kmacro-start-macro-or-insert-countervới tiền tố ( C-u) để nối vào macro trước đó.


2
Các docstring không nói như vậy, nhưng một tiền tố arg kép ( C-u C-u) bộ cả các APPENDNO-EXECđối số start-kbd-macro, cho phép bạn thêm mà không phát lại ban đầu của vĩ mô-so-xa. Hành vi này được ghi lại trong hướng dẫn, tuy nhiên:(emacs) Basic Keyboard Macro
phils

Hãy thử điều này với ví dụ trong câu hỏi của tôi, không hoạt động.
Christopher Xong

2

Kết hợp các câu trả lời tốt từ stsquad và artagnon đưa ra (theo suy nghĩ của tôi) một giải pháp tổng thể cho vấn đề hoàn toàn hợp lý:

  • C-xC-keC-hl để chỉnh sửa một macro được tạo ra từ tổn thất
  • chỉnh sửa macro, để giảm nó về bản ghi gốc
  • C-cC-c để lưu trữ macro đã chỉnh sửa
  • Hoặc C-u<f3>để trước hết là phát lại macro, và sau đó tiếp tục ghi tổ hợp phím sau đó sẽ được nối thêm vào định nghĩa vĩ mô
  • ... hoặc C-uC-u<f3>để tiếp tục ghi mà không cần phát lại ban đầu của macro cho đến nay.

Có thể nhu cầu chỉnh sửa tổn thất là macro không lý tưởng , nhưng (a) bạn nhất định phải chỉnh sửa macro bất kể, nếu bạn đã hủy ghi âm và (b) điều này không nên xảy ra thường xuyên, nếu bạn chỉ nhớ làm thế nào để dừng macro bình thường (ví dụ với <f4>thay vì C-g).

Không ai trong số đó nói rằng nó sẽ không hữu ích nếu macro bị hủy bỏ được lưu trữ ở đâu đó; chỉ là tôi không nghĩ rằng điều này thực sự xảy ra. Nó có lẽ sẽ có giá trị M-x report-emacs-bugđể đề xuất tính năng này.


Điều này không giải quyết vấn đề. Với giải pháp của bạn một nửa thời gian, sẽ dễ dàng hơn để bắt đầu lại macro. Tôi đã đăng một câu trả lời ở nơi khác mà giải quyết vấn đề độc đáo.
Christopher Xong

1
Chắc chắn, đối với các trường hợp đơn giản bắt đầu lại sẽ dễ dàng hơn. Tuy nhiên, nó vẫn hữu ích cho phần còn lại, điều đó có nghĩa là một số người sẽ thấy nó hữu ích; đặc biệt là nó có sẵn theo mặc định. Như tôi đã chỉ ra, tôi nghĩ rằng ý tưởng về cách tiếp cận tự động hơn là một cách tốt, vì vậy tôi rất vui khi thấy bạn làm việc trên một giải pháp và chắc chắn đã bỏ phiếu cho câu trả lời của bạn.
phils

0

Giải pháp chính tắc là C-x C-k C-e( kmacro-edit-macro) sẽ cho phép bạn thực hiện từng bước nhấn phím và chèn / xóa bất cứ điều gì bạn muốn. Cú pháp lệnh cho trình soạn thảo hơi ngắn gọn nhưng ?sẽ đưa ra một hướng dẫn. Có một trình soạn thảo tự nhiên hơn ràng buộc với C-x C-k e( edit-kbd-macro) cung cấp trình soạn thảo macro văn bản đơn giản với chú thích.

Một tùy chọn khác là M-x insert-kbd-macrocho phép bạn chỉnh sửa macro như Lisp nhưng nó không phải là thứ dễ đọc nhất trên thế giới.

Theo như các biến có liên quan bạn đang tìm kiếm last-kbd-macrokmacro-ring.

Như bạn đã đề cập, bạn chưa hoàn thành macro của mình, bạn chỉ có thể tạo nó từ tổn thất của mình. C-x C-k e C-h lvà xóa tối đa 300 ký tự trước.


Đây là một câu trả lời tồi tôi sẽ downvote nếu tôi có thể. Bạn đã không đọc câu hỏi hoặc đang bỏ qua nó. Không có last-kbd-macrohoặc không kmacro-ringchứa các phím được nhấn trước đó C-ghoặc xảy ra lỗi. Tôi đặc biệt đặt NỀN TẢNG trong tất cả các mũ trong tiêu đề của tôi dự đoán những câu trả lời tồi tệ như vậy. Cảm ơn bạn đã cố gắng để giúp đỡ mặc dù.
Christopher Xong

1
@ChristopherDone: chắc chắn bạn có thể - Tôi đã thêm một ghi chú ở phía dưới để đề cập đến sự mất mát. Bạn có thể tạo một macro từ tối đa 300 ký tự đã nhập trước đó của bạn.
stsquad

Vâng, có người đã đề cập đến sự mất mát trên #emacs. Tôi chỉ muốn tiếp tục nơi tôi rời đi. Tôi không muốn phải mở trình soạn thảo và bắt đầu xóa mọi thứ từ đó khi tôi đang làm gì đó.
Christopher Xong

2
Sự kết hợp giữa câu trả lời này và câu trả lời của artagnon đưa ra một giải pháp tốt : C-x C-k e C-h l, chỉnh sửa, C-c C-csau đó C-u f3tiếp tục ghi âm (lưu ý rằng lần cuối cùng f3trước tiên sẽ phát macro - cho đến nay trước khi chờ thêm đầu vào). Có thể nhu cầu chỉnh sửa tổn thất là macro không lý tưởng , nhưng (a) bạn nhất định phải chỉnh sửa macro bất kể, nếu bạn đã hủy ghi âm và (b) điều này không nên xảy ra thường xuyên, nếu bạn chỉ cần nhớ làm thế nào để dừng macro bình thường.
phils

1
@phils +1 Có lẽ bạn nên biến điều đó thành một câu trả lời riêng.
itjeyd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.