2013-11-04 16 views
6

Tôi có một chức năng Elisp có một đối số (cho đến nay rất tốt). Đối số này được cho là một mục từ danh sách và không có gì khác.Chức năng Elisp chọn đối số từ danh sách

Có cách nào tôi có thể hiển thị danh sách theo loại "bộ đệm lựa chọn" (như dired), nơi người dùng có thể điều hướng đến mục và chọn bằng cách nhấn enter, thay vì phải nhập chuỗi theo cách thủ công ?

Trả lời

5

Cách thông thường để thực hiện điều đó là qua completing-read. Sau đó, bạn có thể sử dụng nơi bạn gọi minibuffer-completion-help để bật bộ đệm *Completions* ngay lập tức để người dùng có thể nhấp vào lựa chọn của mình.

4

Nếu tôi hiểu câu hỏi một cách chính xác, bạn đang tìm kiếm một cái gì đó như thế này:

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

Quá trình lựa chọn không thích dired, nhưng người ta thường cho emacs người dùng lựa chọn từ một danh sách sử dụng ido hoặc khác lựa chọn thay thế tương tự. Bạn có thể thu hẹp tìm kiếm của mình, di chuyển giữa các lựa chọn thay thế và một loại dài vv Loại M-x tùy chỉnh nhóm RET ido nếu bạn muốn có cảm giác về sở thích nào bạn có thể tùy chỉnh.

4

gì bạn đang tìm kiếm là completing-read:

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

Tôi thích sử dụng popup-menu cho các loại hình điều:

(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, ai muốn sử dụng (mapcar 'cons your-list-of-strings your-list-of-strings) à la chung Lisp, nhưng elisp chỉ có chức năng đơn nhất trong mapcar :-(

Các vấn đề liên quan