问题
I want to ask a second question to the user depending on the answer to the first one.
(defun something (a b)
(interactive
(list
(read-number "First num: ")
(read-number "Second num: ")))
(message "a is %s and b is %s" a b))
So I need a way to test the entry values :
(defun something-else (a &optional b)
(interactive
(list
(read-number "First num: ")
(if (< a 2)
(read-number "Second num: "))))
(message "a is %s" a))
But
if: Symbol's value as variable is void: a
Question : How can I use interactive in a really interactive way?
回答1:
(defun xtest (a &optional b)
(interactive
(let (a b)
(setq a (read-number "First: "))
(if (< a 2)
(setq b (read-number "Second: ")))
(list a b)))
(message "a is %s b is %s" a b))
回答2:
Interpret the form in interactive as kind of subprogram which delivers the list of argument values as return value.
You can have local variables there with the help of a let-like form.
(defun something-else (a &optional b)
(interactive
(let* ((a-local (read-number "First num: "))
(b-local (when (< a-local 2)
(read-number "Second num: "))))
(list a-local b-local)))
(message "a is %s, b is %s" a b))
In the above example a-local and b-local are variables with names of your choice wich are local to the enclosing let*-form. The star in let* means that the evaluated expression (read-number "First num: ") for a-local is assigned to a-local before the expression (when (< a-local 2) (read-number "Second num: ")) for b-local is evaluated.
来源:https://stackoverflow.com/questions/25447312/emacs-lisp-how-to-use-interactive-for-conditional-arguments