Làm cách nào để lưu macro bàn phím dưới dạng chức năng Lisp?


41

Rất thường xuyên, tôi sẽ cần phải thực hiện tập hợp các bước yêu cầu nhiều nét chính. Đối với cùng một phiên, các bước đó có thể được ghi lại trong macro bàn phím.

Một ví dụ là lưu hoạt động tìm kiếm / thay thế được thực hiện thường xuyên dưới dạng macro bàn phím. Nhưng vĩ mô đó bị mất khi tôi bỏ emacs.

Làm cách nào tôi có thể lưu macro bàn phím được sử dụng thường xuyên của mình dưới dạng chức năng Lisp?

Để đơn giản, tôi muốn lưu hành động thay thế "abc" bằng "def" làm chức năng để tôi có thể sử dụng lại nó qua các phiên emacs.

Câu trả lời:


48

Dưới đây là các bước mà bạn có thể làm theo:

  • Chọn khu vực bạn muốn thực hiện thay thế tìm kiếm.
  • Bắt đầu ghi macro.

    M-x start-kbd-macro

  • Thực hiện các yêu cầu M-x query-replace-regexp(thay thế "abc" bằng "def") và sử dụng !để buộc tìm kiếm thay thế trong toàn khu vực.
  • Dừng ghi macro.

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

  • Làm M-x kmacro-name-last-macrovà đặt cho macro một tên mô tả như thế nào replace-abc-with-def. Sau đó, bạn sẽ có thể gọi lại macro đó bằng cách thực hiện M-x replace-abc-with-def.
  • Bây giờ hãy lưu macro này dưới dạng một hàm vào một tệp mà bạn tải trong quá trình khởi tạo emacs; ví dụ, init.el.
    • M-x insert-kbd-macro
    • Chọn macro được đặt tên của bạn sẽ được chèn vào đó.

replace-abc-with-defĐịnh nghĩa hàm được tạo tự động trông như thế này:

(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)))

Bây giờ bạn có thể M-x replace-abc-with-deftrong tất cả các phiên emacs của bạn.


1
+1 cho insert-kbd-macro. Đó là câu trả lời cho câu hỏi (và phần còn lại của câu trả lời này cung cấp trợ giúp bổ sung).
vẽ

6
Cũng lưu ý rằng Emacs có thể tạo hai định dạng khác nhau cho macro bàn phím. Cái nào bạn nhận được khi bạn insert-kbd-macrophụ thuộc vào việc bạn đặt tên cho nó bằng cách sử dụng kmacro-name-last-macro(như trong câu trả lời ở trên) hoặc name-last-kbd-macro.
phils

1
Lưu ý rằng nếu bạn sử dụng name-last-kbd-macrođịnh dạng (như được đề cập bởi @phils ở trên), bạn sẽ kết thúc bằng một chuỗi, không phải là một hàm. fsetcho biết một biểu tượng cho phép bạn thực thi macro bằng Mx, nhưng không gọi nó từ lisp ( commandp-> t, functionp-> nil). Thật kỳ lạ, thậm chí gọi nó thông qua call-interactivelykhông hoạt động (mặc dù bạn có thể sử dụng execute-kbd-macrođể chạy nó).
pyrocrasty

24

elmacro đã được đề cập bởi @lunaryorn, nhưng là tác giả của gói này, tôi nghĩ thật tuyệt khi cung cấp một ví dụ.

Nếu bạn ghi một macro như thế này:

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

Sau đó, M-x elmacro-show-last-macro upcase-last-wordtạo ra một bộ đệm với:

(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

Các elmacro gói cho phép bạn xem các macro ghi lại cuối cùng là thích hợp Emacs Lisp với M-x elmacro-show-last-macro.


7
Ai đó giới thiệu gói của tôi \ o /
Silex
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.