2010-12-26 38 views
7

Tôi chỉ mới bắt đầu học các emacs (woohoo!) Và tôi đã mút xung quanh trong số .emacs của tôi khá vui vẻ. Thật không may, tôi không biết Lisp được nêu ra, vì vậy tôi đang gặp vấn đề với những điều cơ bản.Làm cách nào để liên kết khóa với "hàm được trình bày bằng chuỗi khóa sau"?

Tôi đã ánh xạ một vài phím cho đến khi tôi sửa chữa bộ nhớ cơ bắp của tôi:

(global-set-key (kbd "<f9>") 'recompile) 

Đó là tốt. Nhưng làm thế nào tôi có thể nói một chìa khóa để 'mô phỏng cách nhấn một số phím'? Ví dụ, tôi không biết, làm cho <f1> làm tương tự như C-u 2 C-x } (mở rộng bộ đệm bằng hai ký tự).

Một cách là tìm kiếm C-x } cuộc gọi shrink-window-horizontally và thực hiện một số loại điều lambda. Đây là khóa học gọn gàng và thanh lịch (bạn làm thế nào?). Nhưng chắc chắn có một cách để xác định <f1> để gửi tổ hợp phím C-u 2 C-x }?

Trả lời

8

Đố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-macroRET (tên) RET
Mxinsert-kbd-macroRETRET

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.

+0

Rất cám ơn! 1 cho tôi thấy cách chung để làm điều này. – katrielalex

17

Chắc chắn có, và đó là cách rõ ràng:

(global-set-key (kbd "<f1>") (kbd "C-u 2 C-x }")) 
+3

Cảm ơn bạn rất nhiều. Đó là hư không gần như rõ ràng như bạn nghĩ. :) Đã tìm kiếm điều này trong một thời gian dài. – spk

8

tôi sẽ sử dụng shrink-window-horizontally như ví dụ chức năng, nhưng bạn có thể khái quát ý tưởng cho bất kỳ ràng buộc bạn muốn xác định.

Nếu bạn muốn sử dụng hai như số lượng mặc định để thu nhỏ cửa sổ, chứ không phải là một, hãy thử như sau:

(global-set-key [f9] 
    (lambda (&optional n) 
    (interactive "P") 
    (shrink-window-horizontally (or n 2)))) 

Đó liên kết với các F9 chìa khóa để một chức năng tương tác chấp nhận một đối tiền tố. Nếu bạn chỉ cần nhấn F9, you'll pass no argument, trong đó triệu tập giá trị mặc định là 2, vì tham số n sẽ nhận được nil làm đối số. Tuy nhiên, nếu bạn nhấn, nói, C-u 10 F9, bạn sẽ vượt qua mười làm đối số cho n. Điều này cho phép bạn sử dụng ràng buộc của bạn linh hoạt hơn.

+0

Tôi ước tôi có thể chấp nhận nhiều câu trả lời ... +1. – katrielalex

Các vấn đề liên quan