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.