2012-03-24 3 views
10

Как вы пишете функцию elisp, которая должна быть привязана к нажатию клавиши, которая работает без запроса по умолчанию, но когда предшествующий Ctrl-u запрашивает у пользователя аргумент , Что-то похожее (это неправильный синтаксис, но я надеюсь, что вы поняли эту идею)?Как создать интерактивную функцию elisp с необязательными аргументами

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

ответ

3

После такой же реализации в вашем примере, вы могли бы сделать что-то вроде этого:

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

Если вы хотите использовать функцию как интерактивное, этот код все, что вам нужно :

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

вам не нужно & факультативно, на самом деле я не уверен, что это уместно – erjoalgo

+0

Уход за разработкой? –

18

следующее использование особенность interactive, что позволяет использовать код вместо строки. Этот код будет выполнен только тогда, когда функция будет вызвана в интерактивном режиме (что делает этот вариант другим ответом по сравнению с более ранним ответом). Код должен оцениваться в списке, в котором элементы сопоставляются с параметрами.

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

С помощью этого метода, эта функция может быть вызвана из кода как (my-test) или (my-test "X") без него, побуждая пользователя для приглашения. В большинстве ситуаций вы хотели бы создавать функции, чтобы они запрашивали ввод только при интерактивном вызове.

Смежные вопросы