2012-03-24 26 views
10

Varsayılan olarak sormadan çalışacak, ancak Ctrl-u tarafından önceden çağrıldığında bir argüman için kullanıcı soran bir elisp işlevi nasıl yazılır . Benzer bir şey (ki bu yanlış bir sözdizimi, ama umarım fikrini alırsınız)? senin örnek olarak uygulanması aynı tür ardındanİsteğe bağlı argümanlar ile etkileşimli elisp işlevi nasıl oluşturulur

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

cevap

3

, böyle bir şey yapabileceğini:

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

sadece etkileşimli olarak işlevini kullanmak istiyorsanız, bu kod tek ihtiyacınız olan :

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

orada & isteğe bağlı gerekmez, aslında uygun olduğundan emin değilim – erjoalgo

+0

Ayrıntılı bakım? –

18

aşağıdaki kullanım yerine bir dize kod kullanmasına olanak verir interactive bir özelliği. Bu kod sadece fonksiyon interaktif olarak adlandırıldığında çalıştırılacaktır (bu, önceki cevaba göre farklı bir cevap yapar). Kod, elemanların parametrelere eşlendiği bir listeye değerlendirmelidir.

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

bu yöntemi kullanarak, bu işlev bir istemi için kullanıcıya sormadan (my-test) veya (my-test "X") gibi koddan çağrılabilir. Çoğu durumda, işlevleri yalnızca etkileşimli olarak çağrıldığında girdiler için tasarlayacak şekilde tasarlamak istersiniz.

İlgili konular