Faça a ordem de classificação de respeito de leitura e conclusão de uma coleção


10

Ou:

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

ou:

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

produz o mesmo resultado no buffer de conclusão ao pressionar TAB. Como faço para respeitar a ordem de classificação?

Respostas:


9

A ordem de classificação na lista * Conclusões * é determinada pela display-sort-functionpropriedade da sua tabela de conclusão (conforme retornado por completion-metadata). No seu caso, sua tabela de conclusão não possui essa propriedade; portanto, ela volta ao padrão, que é classificar em ordem alfabética.

Você pode 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))))

e depois

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

[Isso pressupõe que você esteja usando lexical-binding. ]


Se você icompletetambém quiser respeitar o pedido, poderá adicionar um (cycle-sort-function . ,#'identity)à lista de metadados.
Omar

2

completing-readuma lista de listas e ela respeitará a ordem:

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

A doutrina diz:

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

Leia uma sequência no minibuffer, com conclusão. PROMPT é uma string para solicitar; normalmente termina em dois pontos e um espaço. COLEÇÃO pode ser uma lista de strings, uma lista, uma lista ou uma tabela de hash. ...

Portanto, pode levar um alist como uma coleção. Na verdade, você está criando um alist com chaves, mas sem valores.


Isso não funciona para mim no Emacs 27.
Adam Simpson

2

Eu sugeriria não usar este feitiço antigo.

O built-in ido-completing-readnão tem essa deficiência:

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

Nem helm:

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

11
O problema ido-completing-readé que ele tem um caractere ^de nova linha estranho semantic-format-tag-summarize. Quanto ao Helm, não posso assumir que todos o usem. É por isso que completing-readé a única opção.
Tu Do

Essa é uma razão esfarrapada para não usá-lo. Apenas pós-processe o que semantic-format-tag-summarizelhe der.
abo-abo

Ou envie um relatório de bug paraido
abo-abo

11
Fiz isso também, mas não tive sucesso. A saída de semantic-format-tag-summarizeretorna algo no final, mas o caractere não é exibido em completing-readou helm-comp-read. Eu já escrevi outra função no lugar de semantic-format-tag-summarize, sem rosto ainda. Para exibir tags (com cores) para os usuários, ainda uso, semantic-format-tag-summarizemas em vez disso, um buffer personalizado com widgets de texto.
Tu Do

Provavelmente, enviarei um bug para o Ido depois de descobrir o que semantic-format-tag-summarizeretorna no final. Eu tinha uma solução, mas ainda quero saber uma solução para completing-read. Eu sei que Helm consegue, mas só queria saber se completing-readexiste uma maneira fácil .
Tu Do

1

Se você usar Sincelos , o pedido será respeitado completing-read.

(E você pode classificar usando ordens de classificação diferentes , de forma interativa ou via Lisp. E, ao contrário do Emacs de baunilha, a classificação afeta a *Completions*exibição e a ordem do ciclo.)


11
Mesmo que o comentário na resposta de abo-abo, não posso confiar em pacotes externos. E ido-completing-readestá tendo algum problema.
Tu Do

2
Talvez você não possa, mas talvez outra pessoa possa. ;-) Esta é uma solução simples para o problema apresentado: basta usar completing-readcom pingentes. Você pode até ligar icicle-modetemporariamente (por exemplo, para a chamada para completing-read), usando, por exemplo, macro icicle-with-icy-mode-ON.
Desenhou
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.