Đối với bất cứ điều gì lâu dài, tôi sẽ giới thiệu phương pháp được hiển thị bởi seh, vì tự nhiên sẽ mạnh mẽ hơn trong hầu hết các trường hợp. Nó đòi hỏi nhiều hơn một chút công việc và bí quyết, tất nhiên, nhưng tất cả đều đáng giá :)
phương pháp tiếp cận angus 'giống như một phiên bản cắt giảm của tính năng macro bàn phím cung cấp cho Emacs tên của nó (và hơi đơn giản để sử dụng so với macro cho ví dụ được đề cập). Bạn chắc chắn phải nhận thức được macro, tuy nhiên - chúng có thể cực kỳ hữu ích, và đối với bất cứ điều gì phức tạp hơn nó nhanh chóng trở nên dễ dàng hơn để ghi lại một cách năng động hơn là viết ra tất cả các khóa cá nhân theo cách thủ công.
Dưới đây là tóm tắt tôi đã viết bản thân mình của các bit quan trọng nhất:
;;;; * Keyboard macros
;; C-x ( or F3 Begin recording.
;; F3 Insert counter (if recording has already commenced).
;; C-u <n> C-x ( or F3 Begin recording with an initial counter value <n>.
;; C-x) or F4 End recording.
;; C-u <n> C-x) or F4 End recording, then execute the macro <n>-1 times.
;; C-x e or F4 Execute the last recorded keyboard macro.
;; e or F4 Additional e or F4 presses repeat the macro.
;; C-u <n> C-x e or F4 Execute the last recorded keyboard macro <n> times.
;; C-x C-k r Apply the last macro to each line of the region.
;; C-x C-k e Edit a keyboard macro (RET for most recent).
;; C-x C-k b Set a key-binding.
;;
;; If you find yourself using lots of macros, you can even name them
;; for later use, and save them to your init file.
;; M-x name-last-kbd-macro RET (name) RET
;; M-x insert-kbd-macro RET (name) RET
;;
;; For more documentation:
;; C-h k C-x (
;; M-: (info "(emacs) Keyboard Macros") RET
Nếu chúng tôi chơi với các ví dụ từ câu hỏi, bạn sẽ thấy cách một số trong những điều kết hợp chặt chẽ ...
Để bắt đầu, bạn có thể xác định vĩ mô với F3CủCx}F4
Sau đó, bạn có thể gắn nó tạm thời để F1 với CxCkbF1 (thực sự điều đó không đúng nếu F1 hiện là một khóa tiền tố cho một sơ đồ bàn phím hiện có, khi gõ nó tương tác sẽ chỉ đơn giản là nhắc cho phần còn lại. Bạn có thể phá vỡ mã này bằng mã số (global-set-key (kbd "<f1>") ...)
, nhưng tôi khuyên bạn nên gắn bó với số reserved bindings).
Nếu bạn sau đó sử dụng describe-key
(C-hk) để kiểm tra những gì là ràng buộc để chìa khóa đó, Emacs sẽ cho bạn thấy một biểu (lambda)
mà bạn có thể sao chép vào tập tin init của bạn nếu bạn rất muốn.
Ngoài ra, bạn có thể đặt tên cho vĩ mô và yêu cầu Emacs để chèn mã vào bộ đệm hiện tại:
Mxname-last-kbd-macro
RET (tên) RET
Mxinsert-kbd-macro
RETRET
Mã này sẽ trông khác với biểu thức lambda được hiển thị bởi describe-key
, nhưng nếu bạn đánh giá macro được chèn, bạn sẽ thấy sự tương đương. Bạn cũng có thể chỉ ra rằng biểu thức (kbd "...")
cũng đánh giá đến cùng một giá trị, và do đó tất cả chỉ là những cách thay thế để làm điều tương tự.
(Bạn có thể sử dụng * cào * đệm để đánh giá các mã bởi thời điểm di chuyển sau khi kết thúc sự biểu hiện, và một trong hai cách gõ CxCe để hiển thị các giá trị trong minibuffer, hoặc Cj để chèn giá trị vào bộ đệm).
Lưu ý rằng mã 'được chèn' sử dụng fset
để gán macro cho một biểu tượng. Bạn có thể liên kết macro với khóa bằng cách thực hiện (fset)
và sau đó gán biểu tượng đó cho khóa bằng (global-set-key)
hoặc bạn có thể bỏ qua (fset)
và chỉ cần gán trực tiếp giá trị macro. Điều này, tất nhiên, là trực tiếp tương đương với câu trả lời của angus '.
Edit: Tôi vừa mới nhận thấy rằng có một chức năng kmacro-name-last-macro
ràng buộc để CxCkn đó là gần như giống hệt nhau trong hình thức để name-last-kbd-macro
, nhưng mà tạo ra các hình thức biểu thức lambda thấy khi sử dụng kmacro-bind-to-key
(CxCkb) và describe-key
.
Rất cám ơn! 1 cho tôi thấy cách chung để làm điều này. – katrielalex