2014-12-03 21 views
9

Tôi mới làm quen với các emacs và có một câu hỏi tân binh. Tôi có thể liên kết khóa với một hàm cụ thể theo (global-set-key (kbd "C-c a b c") 'some-command), trong đó some-command là một hàm. Làm thế nào tôi có thể gọi hai chức năng (nói some-commandsome-other-command) với một ràng buộc khóa? Cảm ơn rất nhiều!Ràng buộc khóa Emacs cho nhiều lệnh

Trả lời

10

Bạn có thể xác định chức năng của riêng bạn gọi hai chức năng này và liên kết khóa với chức năng của riêng bạn. Hoặc sử dụng một lambda đơn giản:

(global-set-key (kbd "C-c a b c") (lambda() (interactive) (some-command) (some-other-command))) 
+0

@Stefan Bạn vui lòng giải thích lý do tại sao không trích dẫn lambdas? – songyuanyao

+0

Điều này hoạt động tuyệt vời. Cảm ơn! Tôi có cùng một câu hỏi về câu nói mặc dù --- Tôi thường cũng trích dẫn các lambdas, và muốn biết tại sao không. –

+2

@songyuanyao: Bởi vì ''(...) 'là một * danh sách *, không phải là * chức năng *. Xem http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used/16802304#16802304 – Stefan

0

Bạn có thể xác định một functon khác với defun trong đó bạn gọi những người khác bằng funcall hoặc apply như vậy, khi bạn gọi hàm thứ ba này (bạn cũng có thể liên kết) nó sẽ gọi những người khác.

1

Xác định lệnh gọi từng chức năng (lệnh) mà bạn muốn, có điều kiện. Sử dụng tiền tố arg để phân biệt cái nào để gọi. Vì vậy, nếu lệnh điều phối mới được ràng buộc, ví dụ: C-o, thì C-u C-o sẽ gọi một trong các chức năng và C-o (không có tiền tố arg) sẽ gọi lệnh kia.

Bạn sẽ muốn làm C-h f interactive, để xem làm thế nào để xác định một lệnh công nhận một đối số tiền tố, vv Tư vấn hướng dẫn elisp cũng - sử dụng i interactive để tìm nơi nó dạy này.

Đây là một bài tập dễ dàng và thú vị. Học cách xác định các lệnh đơn giản của riêng bạn là một cách hay để bắt đầu nói chuyện với Emacs bằng ngôn ngữ riêng của nó.

15

Tôi khuyên bạn nên không bao giờ ràng buộc biểu thức lambda để chìa khóa, vì lý do đơn giản rằng khi bạn hỏi Emacs gì quan trọng mà có, nó sẽ kết thúc nói cho bạn một cái gì đó như thế này (sử dụng được chấp nhận mã, khi byte-biên soạn, là một ví dụ):

C-c a b c runs the command #[nil "\300 \210\301 \207" [some-command 
some-other-command] 1 nil nil], which is an interactive compiled Lisp 
function. 

It is bound to C-c a b c. 

(anonymous) 

Not documented. 

Nếu bạn không bao giờ byte-biên dịch mã của bạn, nó ít khó hiểu, nhưng vẫn chưa định dạng:

C-c a b c runs the command (lambda nil (interactive) (some-command) 
(some-other-command)), which is an interactive Lisp function. 

nào, trong khi vẫn có thể đọc được trong trường hợp có một chức năng nhỏ như thế này, hãy nhận được nhanh chóng không thể hiểu được đối với các chức năng lớn hơn.

So với:

C-c a b c runs the command my-run-some-commands, which is an 
interactive compiled Lisp function in `foo.el'. 

It is bound to C-c a b c. 

(my-run-some-commands) 

Run `some-command' and `some-other-command' in sequence. 

nào bạn nhận được nếu bạn tên chức năng (trong đó khuyến khích bạn ghi lại nó nhiều hơn một chức năng ẩn danh không).

(defun my-run-some-commands() 
    "Run `some-command' and `some-other-command' in sequence." 
    (interactive) 
    (some-command) 
    (some-other-command)) 

(global-set-key (kbd "C-c a b c") 'my-run-some-commands) 

Cuối cùng, như abo-abo chỉ ra, điều này cũng có nghĩa là bạn có thể dễ dàng lần định nghĩa chức năng mà bất cứ lúc nào, để xem hoặc chỉnh sửa /-tái đánh giá mã, hoặc bằng cách làm theo các liên kết được cung cấp trong bộ đệm trợ giúp (ví dụ: foo.el trong ví dụ của tôi) hoặc bằng cách sử dụng Mxfind-function (nhập tên hàm) hoặc Mxfind-function-on-key (nhập chuỗi khóa liên kết).

+2

Điều quan trọng là bạn có thể chuyển sang định nghĩa bằng cách sử dụng phương pháp này. –

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