Fai in modo che il completamento della lettura rispetti l'ordinamento di una raccolta


10

O:

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

o:

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

produce lo stesso risultato nel buffer di completamento quando si preme TAB. Come faccio a rispettarlo?

Risposte:


9

L'ordinamento nell'elenco * Completamenti * è determinato dalla display-sort-functionproprietà della tabella di completamento (come restituita da completion-metadata). Nel tuo caso, la tabella di completamento non ha tale proprietà, quindi ricade sull'impostazione predefinita, che è l'ordinamento alfabetico.

Puoi usare:

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

e poi

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

[Questo presuppone che tu stia usando lexical-binding. ]


Se desideri icompleterispettare anche l'ordine, puoi aggiungere (cycle-sort-function . ,#'identity)a all'elenco dei metadati.
Omar,

2

Fornisci completing-readun elenco di elenchi e rispetterà l'ordine:

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

Il docstring dice:

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

Leggi una stringa nel minibuffer, con il completamento. PROMPT è una stringa con cui richiedere; normalmente termina in due punti e uno spazio. COLLECTION può essere un elenco di stringhe, un elenco, un obarray o una tabella hash. ...

Può quindi prendere una lista come raccolta. In effetti, stai creando un elenco con chiavi ma senza valori.


Questo non funziona per me in Emacs 27.
Adam Simpson

2

Suggerirei di non usare questo antico incantesimo.

Il built-in ido-completing-readnon ha questo difetto:

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

Nemmeno helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))

1
Il problema ido-completing-readè che ha uno strano carattere newline ^da semantic-format-tag-summarize. Per quanto riguarda Helm, non posso presumere che tutti lo usino. Ecco perché completing-readè l'unica opzione.
Ma Do

Questa è una ragione zoppa per non usarla. Postprocesso tutto ciò che semantic-format-tag-summarizeti dà.
abo-ABO

O inviare una segnalazione di bug perido
abo-ABO

1
L'ho fatto anch'io ma non ci sono riuscito. L'output di semantic-format-tag-summarizerestituisce qualcosa alla fine, ma il carattere non viene visualizzato in completing-reado helm-comp-read. Ho già scritto un'altra funzione al posto di semantic-format-tag-summarize, senza volto ancora. Per visualizzare i tag (con i colori) agli utenti, utilizzo comunque semantic-format-tag-summarizeun buffer personalizzato con widget di testo.
Martedì

Probabilmente invierò un bug a Ido dopo aver scoperto cosa semantic-format-tag-summarizeritorna alla fine. Avevo una soluzione ma voglio ancora sapere una soluzione completing-read. So che Helm può farcela, ma volevo solo sapere se completing-readesiste un modo semplice per farlo .
Tu Do

1

Se usi Icicles, l'ordine è rispettato da completing-read.

(E puoi ordinare usando diversi ordinamenti , in modo interattivo o tramite Lisp. E a differenza di Emacs alla vaniglia, l'ordinamento influisce sia sulla *Completions*visualizzazione che sull'ordine ciclico.)


1
Come nel commento della risposta di abo-abo, non posso fare affidamento su pacchetti esterni. E ido-completing-readsta avendo qualche problema.
Tu Do

2
Forse non puoi, ma forse qualcun altro può. ;-) Questa è una soluzione semplice al problema come proposto: basta usare completing-readcon Icicles. Puoi anche solo attivare icicle-modetemporaneamente (ad esempio per la chiamata a completing-read), utilizzando, ad esempio, la macro icicle-with-icy-mode-ON.
Estratto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.