10

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

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

4

4 回答 4

8

您正在寻找的是completing-read

(defun foo (arg)
  (interactive (list (completing-read ...)))
  ....)
于 2013-11-04T19:31:27.193 回答
8

通常的方法是通过completing-read. 然后你可以使用minibuffer-with-setup-hook你调用的地方minibuffer-completion-help来立即弹出一个*Completions*缓冲区,这样用户就可以点击他的选择。

于 2013-11-04T19:21:18.137 回答
4

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

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

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

于 2013-11-04T16:51:17.193 回答
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)à la Common Lisp,但 elisp 只在 mapcar 中使用一元函数 :-(

于 2013-11-07T12:08:24.163 回答