Зробіть порядок читання порядок сортування колекції


10

Або:

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

або:

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

видає такий же результат у буфері завершення при натисканні TAB. Як змусити його дотримуватися порядку сортування?

Відповіді:


9

Порядок сортування у списку * Завершення * визначається display-sort-functionвластивістю таблиці завершення (як повернуто completion-metadata). У вашому випадку ваша таблиця завершення не має такого властивості, тому вона повертається до типового значення, яке необхідно сортувати за алфавітом.

Ви можете використовувати:

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

і потім

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

[Це передбачає, що ви використовуєте lexical-binding. ]


Якщо ви також хочете icompleteповажати порядок, ви можете додати (cycle-sort-function . ,#'identity)до списку метаданих.
Омар

2

Надайте completing-readсписок списків, і він буде дотримуватися порядку:

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

Докстринг говорить:

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

Прочитайте рядок у мінібуфері, із завершенням. PROMPT - рядок, з яким потрібно підказати; зазвичай він закінчується двокрапкою та пробілом. КОЛЕКЦІЯ може представляти собою список рядків, аліст, obarray або хеш-таблицю. ...

Тому він може приймати аліст як колекцію. Насправді ви створюєте список із ключами, але без значень.


Це не працює для мене в Emacs 27.
Адам Сімпсон

2

Я б запропонував не використовувати це давнє заклинання.

Вбудований ido-completing-readне має цього недоліку:

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

Не робить helm:

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

1
Проблема в ido-completing-readтому , що він має дивний символ нового рядка ^з semantic-format-tag-summarize. Щодо Helm, я не можу припустити, що всі користуються ним. Ось чому completing-readєдиний варіант.
Ту до

Це кульгавий привід не використовувати його. Просто опрацьовуйте все, що semantic-format-tag-summarizeвам дає.
або-або

Або надішліть звіт про помилкуido
абобо абобо

1
Я так і зробив, але не досяг успіху. Вихід з semantic-format-tag-summarizeповертає щось наприкінці, але символ не відображається в completing-readабо helm-comp-read. Я вже написав ще одну функцію замість semantic-format-tag-summarize, без обличчя. Для відображення тегів (з кольорами) користувачам я все ще використовую, semantic-format-tag-summarizeале замість цього використовую спеціальний буфер із текстовими віджетами.
Ту до

Ймовірно, я відправлю помилку Ido після того, як дізнаюся, що semantic-format-tag-summarizeповертається наприкінці. У мене було рішення, але я все ще хочу знати рішення completing-read. Я знаю, що Хелм може це зробити, але просто хотів дізнатися, чи існує простий шлях з completing-read.
Ту чи

1

Якщо ви використовуєте Icicles, то порядок дотримується completing-read.

(І ви можете сортувати , використовуючи різні порядки сортування , або в інтерактивному режимі або з допомогою Lisp. І в відміну від ванільного Emacs, сортування впливає як на *Completions*дисплей і велосипедного замовлення.)


1
Як і коментар у відповіді абобо абобо, я не можу покластися на зовнішні пакунки. І ido-completing-readє якась проблема.
Ту до

2
Можливо, ви не можете, але, можливо, хтось інший може. ;-) Це просте вирішення поставленої проблеми: просто використовуйте completing-readз Icicles. Ви можете навіть просто увімкнути icicle-modeтимчасово (наприклад, для дзвінка completing-read), використовуючи, наприклад, макрос icicle-with-icy-mode-ON.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.