Elisp函数从列表中选择参数

时间:2013-11-04 16:34:19

标签: emacs elisp

我有一个Elisp函数,它接受一个参数(到目前为止一直很好)。这个参数应该是列表中的一个项目,而不是别的。

有没有办法可以在“选择缓冲区”(如dired)中显示列表,用户可以导航到该项并通过按Enter键选择它,而不必手动输入字符串?

4 个答案:

答案 0 :(得分:5)

通常的方法是通过completing-read。然后,您可以使用minibuffer-with-setup-hook呼叫minibuffer-completion-help,以便立即弹出*Completions*缓冲区,以便用户点击他的选择。

答案 1 :(得分:5)

您要找的是completing-read

(defun foo (arg)
  (interactive (list (completing-read ...)))
  ....)

答案 2 :(得分:4)

如果我正确理解了这个问题,你正在寻找这样的东西:

(defun foo (list)
  (interactive)
  (let ((arg (ido-completing-read "Select from list: " list))))
     ...)

选择过程与dired不同,但emacs用户通常使用ido或其他类似替代方案从列表中进行选择。您可以缩小搜索范围,在备选方案和长时间之间移动等。如果您想了解可以自定义的偏好,请键入M-x customize-group RET ido。

答案 3 :(得分:0)

我喜欢使用弹出菜单来做这类事情:

(x-popup-menu 
   (list '(50 50) (selected-frame)) ;; where to popup
   (list "Please choose"            ;; the menu itself
         (cons "" (mapcar (function (lambda (item) (cons item item))) 
                  your-list-of-strings))))
顺便说一句,有人想使用(mapcar 'cons your-list-of-strings your-list-of-strings)来使用Common Lisp,但是elisp只使用mapcar中的一元函数:-(