2013-11-04 9 views
6

Ich habe eine Elisp-Funktion, die ein Argument (so weit so gut). Dieses eine Argument soll ein Gegenstand aus einer Liste sein und sonst nichts.Elisp Funktion Auswahl Argument aus der Liste

Gibt es eine Möglichkeit, die Liste in Form eines "Auswahlpuffers" (wie Dired) anzuzeigen, wo der Benutzer zu dem Element navigieren und es durch Drücken von Enter auswählen kann, anstatt die Zeichenfolge manuell eingeben müssen ?

Antwort

5

Der übliche Weg dazu ist über completing-read. Sie können dann eine verwenden, wo Sie minibuffer-completion-help aufrufen, um sofort einen *Completions* Puffer zu öffnen, so dass der Benutzer auf seine Wahl klicken kann.

4

Wenn ich die Frage richtig verstanden, Sie suchen etwas wie folgt aus:

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

Der Auswahlprozess nicht wie dired ist, aber es ist üblich für Emacs Benutzer aus einer Liste auszuwählen ido oder andere Verwendung ähnliche Alternativen. Sie können Ihre Suche einschränken, zwischen Alternativen wechseln und vieles mehr. Geben Sie M-x customize-group RET ido ein, wenn Sie ein Gefühl dafür haben möchten, welche Einstellungen Sie anpassen können.

4

Was Sie suchen ist completing-read:

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

Ich mag Pop-up-Menü für diese Art von Sachen zu verwenden:

(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, möchte man (mapcar 'cons your-list-of-strings your-list-of-strings) à la gemeinsam nutzen Lisp, aber elisp nimmt nur unäre Funktionen in mapcar :-(