2012-03-24 4 views
10

Làm thế nào để bạn viết một hàm elisp, nó sẽ bị ràng buộc với một lần nhấn phím, hoạt động mà không cần nhắc theo mặc định, nhưng khi Ctrl-u đặt trước cho người dùng . Một cái gì đó tương tự (đó là cú pháp sai, nhưng tôi hy vọng bạn sẽ có được ý tưởng)?Cách tạo chức năng elisp tương tác với các đối số tùy chọn

(defun my-message (&optional (print-message "foo")) 
    (interactive "P") 
    (message print-message)) 
(global-set-key "\C-c\C-m" 'my-message) 

Trả lời

3

Tiếp theo cùng một loại thực hiện như ví dụ của bạn, bạn có thể làm một cái gì đó như thế này:

(defun my-message (&optional arg) 
    (interactive "P") 
    (let ((msg "foo")) 
    (when arg 
     (setq msg (read-from-minibuffer "Message: "))) 
    (message msg))) 
3

Nếu bạn chỉ muốn sử dụng các chức năng như là một tương tác, mã này là tất cả các bạn cần :

(defun my-message (&optional ask) 
    (interactive "P") 
    (message (if ask 
       (read-from-minibuffer "Message: ") 
      "foo"))) 
+0

bạn không cần & tùy chọn ở đó, trên thực tế tôi không chắc chắn rằng nó có thích hợp không? – erjoalgo

+0

Chăm sóc để xây dựng? –

18

Sau đây sử dụng tính năng interactive cho phép bạn sử dụng mã thay vì chuỗi. Mã này sẽ chỉ được thực thi khi hàm được gọi là tương tác (mà làm cho câu trả lời này khác với câu trả lời trước đó). Mã nên đánh giá đến một danh sách trong đó các phần tử được ánh xạ tới các tham số.

(defun my-test (&optional arg) 
    (interactive (list (if current-prefix-arg 
         (read-from-minibuffer "MyPrompt: ") 
         nil))) 
    (if arg 
     (message arg) 
    (message "NO ARG"))) 

Bằng cách sử dụng phương pháp này, chức năng này có thể được gọi từ mã như (my-test) hoặc (my-test "X") mà không có nó khiến người sử dụng cho một dấu nhắc. Đối với hầu hết các trường hợp, bạn muốn thiết kế các hàm để chúng chỉ nhắc nhập vào khi được gọi tương tác.