Führen Sie eine Sortierreihenfolge für das Ausfüllen und Lesen einer Sammlung durch

10

Entweder:

(completing-read "test: " '("a" "b" "c"))

oder:

(completing-read "test: " '("c" "b" "a"))

erzeugt beim Drücken das gleiche Ergebnis im Abschlusspuffer TAB. Wie kann ich dafür sorgen, dass die Sortierreihenfolge eingehalten wird?

Tu Do.
quelle

Antworten:

8

Die Sortierreihenfolge in der Liste * Abschlüsse * wird durch die display-sort-functionEigenschaft Ihrer Vervollständigungstabelle bestimmt (wie von zurückgegeben completion-metadata). In Ihrem Fall verfügt Ihre Vervollständigungstabelle über keine solche Eigenschaft, sodass auf die Standardeinstellung zurückgegriffen wird, bei der alphabetisch sortiert wird.

Sie können verwenden:

(defun my-presorted-completion-table (completions)
  (lambda (string pred action)
    (if (eq action 'metadata)
        `(metadata (display-sort-function . ,#'identity))
      (complete-with-action action completions string pred))))

und dann

(completing-read "test: " (my-presorted-completion-table '("a" "b" "c")))

[Dies setzt voraus, dass Sie verwenden lexical-binding. ]]

Stefan
quelle
2

Geben Sie completing-readeine Liste mit Listen an, und die Reihenfolge wird eingehalten:

(completing-read "test: " '(("a") ("b") ("c")))
(completing-read "test: " '(("c") ("b") ("a")))

Der Docstring sagt:

(completing-read PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)

Lesen Sie eine Zeichenfolge im Minibuffer mit Abschluss. PROMPT ist eine Zeichenfolge, mit der Sie aufgefordert werden. Normalerweise endet es in einem Doppelpunkt und einem Leerzeichen. COLLECTION kann eine Liste von Zeichenfolgen, eine Liste, ein Obarray oder eine Hash-Tabelle sein. ...

Es kann daher ein Alist als Sammlung genommen werden. Tatsächlich erstellen Sie eine Liste mit Schlüsseln, jedoch ohne Werte.

Dan
quelle
Dies funktioniert nicht für mich in Emacs 27.
Adam Simpson
2

Ich würde vorschlagen, diesen alten Zauber nicht zu verwenden.

Der eingebaute ido-completing-readhat diesen Mangel nicht:

(ido-completing-read "test: " '("a" "b" "c"))
(ido-completing-read "test: " '("c" "b" "a"))

Weder tut helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))
abo-abo
quelle
1
Das Problem mit dem ido-completing-readist , dass es seltsam Newline Charakter ^aus semantic-format-tag-summarize. Was Helm betrifft, kann ich nicht davon ausgehen, dass jeder ihn benutzt. Deshalb completing-readist die einzige Option.
Tu Do
Das ist ein lahmer Grund, es nicht zu benutzen. Verarbeiten semantic-format-tag-summarizeSie einfach alles, was Sie erhalten.
Abo-Abo
Oder senden Sie einen Fehlerbericht fürido
abo-abo
1
Ich habe das auch getan, aber es ist mir nicht gelungen. Die Ausgabe von semantic-format-tag-summarizegibt am Ende etwas zurück, aber das Zeichen wird nicht in completing-readoder angezeigt helm-comp-read. Ich habe bereits eine andere Funktion anstelle von geschrieben semantic-format-tag-summarize, noch ohne Gesicht. Für die Anzeige von Tags (mit Farben) für Benutzer verwende ich weiterhin semantic-format-tag-summarizeeinen benutzerdefinierten Puffer mit Text-Widgets.
Tu Do
Wahrscheinlich werde ich Ido einen Fehler melden, nachdem ich herausgefunden habe, was semantic-format-tag-summarizeam Ende zurückkommt. Ich hatte eine Lösung, aber ich möchte immer noch eine Lösung dafür wissen completing-read. Ich weiß, dass Helm es schaffen kann, wollte aber nur wissen, ob es einen einfachen Weg completing-readgibt.
Tu Do
1

Wenn Sie Eiszapfen verwenden, wird die Reihenfolge von eingehalten completing-read.

(Und Sie können entweder interaktiv oder über Lisp nach verschiedenen Sortierreihenfolgen sortieren . Im Gegensatz zu Vanille-Emacs wirkt sich das Sortieren sowohl auf die *Completions*Anzeige als auch auf die Zyklusreihenfolge aus.)

Drew
quelle
1
Wie der Kommentar in der Antwort von abo-abo kann ich mich nicht auf externe Pakete verlassen. Und ido-completing-readhat ein Problem.
Tu Do
1
Vielleicht kannst du nicht, aber vielleicht kann es jemand anderes. ;-) Dies ist eine einfache Lösung für das gestellte Problem: nur completing-readmit Eiszapfen verwenden. Sie können sich sogar nur icicle-modevorübergehend einschalten (z. B. für den Anruf an completing-read), z icicle-with-icy-mode-ON. B. mithilfe eines Makros .
Drew