2012-03-24 18 views
10

¿Cómo se escribe una función elisp, que debe estar vinculada a una pulsación de tecla, que funciona sin preguntar de forma predeterminada, pero cuando lo precede Ctrl-u solicita al usuario un argumento . Algo similar a (¿cuál es la sintaxis incorrecta, pero espero que entiendas la idea)?Cómo crear la función elisp interactiva con argumentos opcionales

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

Respuesta

3

Siguiendo el mismo tipo de aplicación como su ejemplo, se podría hacer algo como esto:

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

Si lo que desea es utilizar la función como un interactivo, este código es todo lo que necesita :

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

no necesita el & opcional allí, de hecho, no estoy seguro de que sea apropiado – erjoalgo

+0

¿Cuidar para elaborar? –

18

El siguiente uso una característica de interactive que permite el uso de código en lugar de una cadena. Este código solo se ejecutará cuando la función se llame interactivamente (lo que hace que esta sea una respuesta diferente en comparación con la respuesta anterior). El código debe evaluar a una lista donde los elementos están asignados a los parámetros.

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

Mediante el uso de este método, esta función se puede llamar desde un código como (my-test) o sin ella (my-test "X") solicitar al usuario un mensaje. Para la mayoría de las situaciones, le gustaría diseñar funciones para que solo soliciten la entrada cuando se las llama interactivamente.

Cuestiones relacionadas