2012-03-24 2 views
10

Come si scrive una funzione elisp, che dovrebbe essere associata a un tasto premuto, che funziona senza richiesta di default, ma quando precede Ctrl-u richiede all'utente un argomento . Qualcosa di simile a (che è sintassi sbagliata, ma spero che tu abbia l'idea)?Come creare la funzione elisp interattiva con argomenti opzionali

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

risposta

3

Seguendo lo stesso tipo di implementazione, come il tuo esempio, si potrebbe fare qualcosa di simile:

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

Se si desidera utilizzare la funzione come uno interattivo, questo codice è tutto ciò che serve :

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

non è necessario il & facoltativo lì, in effetti non sono sicuro che sia appropriato – erjoalgo

+0

Cura da elaborare? –

18

L'uso a seguito di una caratteristica di interactive che consente di utilizzare il codice al posto di una stringa. Questo codice verrà eseguito solo quando la funzione viene chiamata in modo interattivo (il che rende questa risposta diversa rispetto alla risposta precedente). Il codice dovrebbe valutare una lista in cui gli elementi sono mappati ai parametri.

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

Utilizzando questo metodo, questa funzione possono essere richiamati dalla codice come (my-test) o (my-test "X") senza richiedere all'utente una richiesta. Per la maggior parte delle situazioni, ti piacerebbe progettare le funzioni in modo che richiedano solo l'input quando vengono chiamate in modo interattivo.