我有一个带有一个参数的Elisp函数(迄今为止这么好)。这一个论点应该是列表中的一个项目,没有别的。Elisp函数从列表中选择参数
有没有一种方法可以显示“选择缓冲区”(如dired)类型的列表,其中用户可以导航到该项目并通过按Enter键进行选择,而不必手动输入字符串?
我有一个带有一个参数的Elisp函数(迄今为止这么好)。这一个论点应该是列表中的一个项目,没有别的。Elisp函数从列表中选择参数
有没有一种方法可以显示“选择缓冲区”(如dired)类型的列表,其中用户可以导航到该项目并通过按Enter键进行选择,而不必手动输入字符串?
通常的做法是通过completing-read
。然后,您可以使用拨打minibuffer-completion-help
的,以便立即弹出*Completions*
缓冲区,以便用户可以点击他的选择。
如果我理解正确的问题,您正在寻找这样的事情:
(defun foo (list)
(interactive)
(let ((arg (ido-completing-read "Select from list: " list))))
...)
选择过程并不是dired,但它是很常见的Emacs用户从使用ido
或其他列表中选择类似的选择。您可以缩小搜索范围,在其他选项之间移动,并可以长时间等待。如果您想要了解您可以自定义的偏好,请键入M-x customize-group RET ido。
你所寻找的是completing-read
:
(defun foo (arg)
(interactive (list (completing-read ...)))
....)
我喜欢用弹出菜单对这样的事情:
(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中的一元函数:-(