Faire un ordre de tri respectant la lecture complète d'une collection

10

Soit:

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

ou:

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

produit le même résultat dans le tampon de fin lorsque vous appuyez sur TAB. Comment le faire respecter l'ordre de tri?

Tu Do
la source

Réponses:

9

L'ordre de tri dans la liste * Achèvement * est déterminé par la display-sort-functionpropriété de votre table d'achèvement (telle que renvoyée par completion-metadata). Dans votre cas, votre table d'achèvement n'a pas une telle propriété, elle revient donc à la valeur par défaut, qui est de trier par ordre alphabétique.

Vous pouvez utiliser:

(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))))

puis

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

[Cela suppose que vous utilisez lexical-binding. ]

Stefan
la source
Si vous souhaitez icompleteégalement respecter l'ordre, vous pouvez ajouter un (cycle-sort-function . ,#'identity)à la liste des métadonnées.
Omar
2

Donnez completing-readune liste de listes, et elle respectera l'ordre:

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

Le docstring dit:

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

Lisez une chaîne dans le mini-tampon, avec achèvement. PROMPT est une chaîne avec laquelle demander; normalement, il se termine par deux points et un espace. COLLECTION peut être une liste de chaînes, une liste, un obarray ou une table de hachage. ...

Il peut donc prendre une liste comme collection. En effet, vous créez une liste avec des clés mais sans valeurs.

Dan
la source
Cela ne fonctionne pas pour moi dans Emacs 27.
Adam Simpson
2

Je suggère de ne pas utiliser ce sort ancien.

Le intégré ido-completing-readn'a pas cette lacune:

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

Pas plus helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))
abo-abo
la source
1
Le problème ido-completing-readest qu'il a un caractère ^de nouvelle ligne étrange semantic-format-tag-summarize. Quant à Helm, je ne peux pas supposer que tout le monde l'utilise. C'est pourquoi completing-readest la seule option.
Tu Do
C'est une raison boiteuse de ne pas l'utiliser. Il suffit de post-traiter tout ce semantic-format-tag-summarizequi vous donne.
abo-abo
Ou soumettre un rapport de bogue pourido
abo-abo
1
Je l'ai fait aussi mais je n'ai pas réussi. La sortie de semantic-format-tag-summarizerenvoie quelque chose à la fin, mais le caractère n'est pas affiché dans completing-readou helm-comp-read. J'ai déjà écrit une autre fonction à la place de semantic-format-tag-summarize, sans visage encore. Pour afficher des balises (avec des couleurs) pour les utilisateurs, j'utilise toujours semantic-format-tag-summarizemais utilise un tampon personnalisé avec des widgets de texte à la place.
Tu Do
Je soumettrai probablement un bogue à Ido après avoir découvert ce qui semantic-format-tag-summarizerevient à la fin. J'avais une solution mais je veux toujours savoir une solution completing-read. Je sais que Helm peut le faire, mais je voulais juste savoir s'il completing-readexiste un moyen facile de le faire .
Tu Do
1

Si vous utilisez Icicles, la commande est respectée par completing-read.

(Et vous pouvez trier en utilisant différents ordres de tri , de manière interactive ou via Lisp. Et contrairement à Emacs vanille, le tri affecte à la fois l' *Completions*affichage et l'ordre de cycle.)

A dessiné
la source
1
Identique au commentaire de la réponse d'abo-abo, je ne peux pas compter sur des packages externes. Et a ido-completing-readun problème.
Tu Do
2
Peut-être que vous ne pouvez pas, mais peut-être que quelqu'un d'autre le peut. ;-) C'est une solution simple au problème tel que posé: il suffit de l'utiliser completing-readavec Icicles. Vous pouvez même simplement activer icicle-modetemporairement (par exemple pour l'appel à completing-read), en utilisant, par exemple, la macro icicle-with-icy-mode-ON.
Drew