Hacer el orden de clasificación de respeto de lectura completa de una colección

10

Ya sea:

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

o:

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

produce el mismo resultado en el búfer de finalización al presionar TAB. ¿Cómo hago que respete el orden de clasificación?

Tu Do
fuente

Respuestas:

9

El orden de clasificación en la lista * Terminaciones * está determinado por la display-sort-functionpropiedad de su tabla de finalización (tal como lo devuelve completion-metadata). En su caso, su tabla de finalización no tiene dicha propiedad, por lo que vuelve al valor predeterminado, que es ordenar alfabéticamente.

Puedes usar:

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

y entonces

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

[Esto supone que estás usando lexical-binding. ]

Stefan
fuente
Si desea icompleterespetar también el orden, puede agregar un (cycle-sort-function . ,#'identity)a la lista de metadatos.
Omar
2

completing-readuna lista de listas, y respetará el orden:

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

La cadena de documentación dice:

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

Lea una cadena en el minibúfer, con finalización. PROMPT es una cadena para solicitar; normalmente termina en dos puntos y un espacio. COLLECTION puede ser una lista de cadenas, una lista, una barra de datos o una tabla hash. ...

Por lo tanto, puede tomar una lista como una colección. En efecto, está creando una lista con claves pero sin valores.

Dan
fuente
Esto no funciona para mí en Emacs 27.
Adam Simpson
2

Sugeriría no usar este antiguo hechizo.

El incorporado ido-completing-readno tiene esta deficiencia:

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

Tampoco lo hace helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))
abo-abo
fuente
1
El problema ido-completing-reades que no tiene carácter de nueva línea extraña ^de semantic-format-tag-summarize. En cuanto a Helm, no puedo asumir que todos lo usen. Por eso completing-reades la única opción.
Tu Do
Esa es una razón lamentable para no usarlo. Solo postprocesar lo semantic-format-tag-summarizeque sea que te dé.
abo-abo
O envíe un informe de error paraido
abo-abo
1
Lo hice también pero no tuve éxito. La salida de semantic-format-tag-summarizedevuelve algo al final, pero el carácter no se muestra en completing-reado helm-comp-read. Ya escribí otra función en lugar de semantic-format-tag-summarize, sin rostro todavía. Para mostrar etiquetas (con colores) a los usuarios, todavía uso semantic-format-tag-summarizepero uso un búfer personalizado con widgets de texto.
Tu Do
Probablemente enviaré un error a Ido después de descubrir qué semantic-format-tag-summarizeregresa al final. Tenía una solución pero todavía quiero saber una solución completing-read. Sé que Helm puede lograrlo, pero solo quería saber si completing-readexiste una manera fácil de hacerlo .
Tu Do
1

Si usa Icicles , el orden es respetado por completing-read.

(Y puede ordenar usando diferentes órdenes de clasificación , ya sea de forma interactiva o mediante Lisp. Y a diferencia de Emacs de vainilla, la clasificación afecta tanto el *Completions*orden de visualización como el ciclo).

Dibujó
fuente
1
Igual que el comentario en la respuesta de abo-abo, no puedo confiar en paquetes externos. Y ido-completing-readestá teniendo algún problema.
Tu Do
2
Quizás no puedas, pero quizás alguien más pueda. ;-) Esta es una solución simple al problema tal como se plantea: simplemente utilícelo completing-readcon Icicles. Incluso puede encender icicle-modetemporalmente (por ejemplo, para la llamada completing-read), usando, por ejemplo, macro icicle-with-icy-mode-ON.
Dibujó