Wykonaj kompletny odczyt kolejności sortowania względem kolekcji

10

Zarówno:

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

lub:

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

daje ten sam wynik w buforze zakończenia po naciśnięciu TAB. Jak sprawić, by przestrzegał porządku sortowania?

Do zrobienia
źródło

Odpowiedzi:

9

Kolejność sortowania na liście * Uzupełnienia * zależy od display-sort-functionwłaściwości tabeli uzupełnień (zwróconej przez completion-metadata). W twoim przypadku tabela ukończenia nie ma takiej właściwości, więc wraca do wartości domyślnej, czyli sortowania alfabetycznego.

Możesz użyć:

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

i wtedy

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

[Zakłada się, że używasz lexical-binding. ]

Stefan
źródło
Jeśli chcesz icompleterównież uszanować kolejność, możesz dodać znak (cycle-sort-function . ,#'identity)do listy metadanych.
Omar
2

Podaj completing-readlistę list, a uszanuje kolejność:

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

Dokument mówi:

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

Po zakończeniu przeczytaj ciąg znaków w minibuforze. PROMPT to ciąg znaków służący do monitowania; zwykle kończy się dwukropkiem i spacją. KOLEKCJA może być listą łańcuchów, alist, obarray lub tablicą haszującą. ...

Może zatem przyjmować alist jako zbiór. W efekcie tworzysz listę z kluczami, ale bez wartości.

Dan
źródło
To nie działa dla mnie w Emacs 27.
Adam Simpson
2

Proponuję nie używać tego starożytnego zaklęcia.

Wbudowany ido-completing-readnie ma tego niedoboru:

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

Ani też helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))
abo-abo
źródło
1
Problemem ido-completing-readjest to, że ma dziwny znak nowej linii ^z semantic-format-tag-summarize. Co do Helma, nie mogę założyć, że wszyscy go używają. Dlatego completing-readjest jedyną opcją.
Tu Do
To kiepski powód, aby go nie używać. Po prostu postprocesuj, co semantic-format-tag-summarizeci daje.
abo-abo
Lub prześlij zgłoszenie błędu dlaido
abo-abo
1
Ja też to zrobiłem, ale mi się nie udało. Wyjście z semantic-format-tag-summarizezwraca coś na końcu, ale znak nie jest wyświetlany w completing-readlub helm-comp-read. Napisałem już inną funkcję zamiast semantic-format-tag-summarizebez twarzy. Do wyświetlania znaczników (z kolorami) użytkownikom nadal używam, semantic-format-tag-summarizeale zamiast tego używam niestandardowego bufora z widżetami tekstowymi.
Tu Do
Prawdopodobnie prześlę błąd do Ido po tym, jak dowiemy się, co semantic-format-tag-summarizezwraca na końcu. Miałem rozwiązanie, ale nadal chcę znać rozwiązanie completing-read. Wiem, że Helm może to zrobić, ale chciałem tylko wiedzieć, czy istnieje łatwy sposób completing-read.
Tu Do
1

Jeśli używasz Sopli, kolejność jest przestrzegana przez completing-read.

(I możesz sortować za pomocą różnych porządków sortowania , interaktywnie lub przez Lisp. W przeciwieństwie do waniliowych Emacsów, sortowanie wpływa zarówno na *Completions*kolejność wyświetlania, jak i kolejność.)

Rysował
źródło
1
Podobnie jak komentarz w odpowiedzi abo-abo, nie mogę polegać na zewnętrznych pakietach. I ido-completing-readma jakiś problem.
Tu Do
2
Być może nie możesz, ale może ktoś inny może. ;-) Jest to proste rozwiązanie postawionego problemu: wystarczy użyć completing-readz Soplami. Możesz nawet po prostu włączyć icicle-modetymczasowo (np. Dla połączenia z completing-read), używając np icicle-with-icy-mode-ON. Makra .
Drew