2013-11-04 37 views
6

我有一个带有一个参数的Elisp函数(迄今为止这么好)。这一个论点应该是列表中的一个项目,没有别的。Elisp函数从列表中选择参数

有没有一种方法可以显示“选择缓冲区”(如dired)类型的列表,其中用户可以导航到该项目并通过按Enter键进行选择,而不必手动输入字符串?

回答

5

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

4

如果我理解正确的问题,您正在寻找这样的事情:

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

选择过程并不是dired,但它是很常见的Emacs用户从使用ido或其他列表中选择类似的选择。您可以缩小搜索范围,在其他选项之间移动,并可以长时间等待。如果您想要了解您可以自定义的偏好,请键入M-x customize-group RET ido。

4

你所寻找的是completing-read

(defun foo (arg) 
    (interactive (list (completing-read ...))) 
    ....) 
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)))) 

BTW,一个想用(mapcar 'cons your-list-of-strings your-list-of-strings)点菜常见Lisp,但elisp只需要mapcar中的一元函数:-(