2010-10-27 4 views
6

Trong các emac, đôi khi tôi gọi nhầm-gọi-kbd-macro. Khi hoàn tác, tôi đã có thể dự kiến ​​hoàn tác để hoàn tác toàn bộ hiệu ứng của macro bàn phím một cách nguyên tử, nhưng điều đó không xảy ra. Thay vào đó, tôi thấy mình phải hoàn tác từng bước của macro một lần. Làm thế nào tôi có thể nhận được emacs để trở về trạng thái đệm trước khi thực hiện vĩ mô?Làm thế nào để hoàn tác lệnh gọi cuối cùng-kbd-macro trong các emacs

Trả lời

2

Tôi e rằng bạn không thể làm điều đó chỉ với cơ chế 'undo được tích hợp sẵn. Hệ thống macro trong Emacs thực sự phát lại mọi thứ như thể người dùng thực sự gõ vào tổ hợp phím (hoặc sự kiện chuột), và do đó, undo history (buffer-undo-list) được cập nhật như bình thường.

Đây là gợi ý về cách mở rộng cơ chế undo hiện tại để thực hiện những gì bạn muốn.

  1. mở rộng 'undo để hiểu một mục mới trong danh sách undo, một dấu hiệu macro-begin và một yếu tố macro-end

  2. tư vấn/thay đổi phát lại macro để chèn dấu vào đầu/kết thúc của playback vĩ mô

  3. có mã undo xử lý tất cả các sự kiện hoàn tác giữa hai điểm đánh dấu làm đơn vị và hoàn tác tất cả (và thêm điểm đánh dấu thích hợp vào cuối lịch sử hoàn tác để khi bạn redo đối xử như một khối duy nhất)

Hãy cẩn thận:

  • Điều này sẽ chỉ làm việc cho các macro hoạt động trong một bộ đệm duy nhất, nếu macro của bạn chuyển sang bộ đệm (hoặc có tác dụng phụ trong bộ đệm khác), những thay đổi sẽ không được coi là một khối.
  • Nếu macro của bạn kết thúc bằng bộ đệm khác với bộ đệm bắt đầu, thì bạn phải xử lý rõ ràng - bạn không muốn "không cân bằng" macro-beginmacro-end điểm đánh dấu trong danh sách hoàn tác.

Không cần phải nói, đây là một nỗ lực phức tạp. Chúc các bạn may mắn.

+1

Cảm ơn Trey. Quả thực là một câu trả lời phức tạp. Một giải pháp đơn giản nhưng mạnh mẽ hơn trong cùng một tinh thần sẽ là thực hiện cuộc gọi-last-kbd-macro (hoặc một trình bao bọc) chèn một số loại điểm đánh dấu no-op trong danh sách hoàn tác. Và sau đó tạo một điểm đánh dấu rõ ràng của chức năng mới để hoàn tác tất cả thay đổi cho đến khi điểm đánh dấu được nhấn. –

+2

Dọc theo các dòng đó là http://www.panix.com/~harley/elisp/undo-group.el, thêm một dấu hiệu là hai 'nil' mà sau đó nó sử dụng như một đường biên cho lệnh 'undo-group' . –