Укажите порядок сортировки коллекции по принципу «завершить чтение»

10

Или:

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

или:

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

выдает тот же результат в буфере завершения при нажатии TAB. Как заставить его соблюдать порядок сортировки?

Ту До
источник

Ответы:

9

Порядок сортировки в списке * Completions * определяется 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 - строка для запроса; обычно это заканчивается двоеточием и пробелом. COLLECTION может быть списком строк, alist, 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. Что касается Хелма, я не могу предположить, что все используют это. Вот почему completing-readэто единственный вариант.
Ту До
Это плохая причина не использовать его. Просто постобработка, что semantic-format-tag-summarizeдает вам.
abo-abo
Или отправьте сообщение об ошибке дляido
abo-abo
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

Если вы используете Сосульки, то порядок соблюдается completing-read.

(И вы можете сортировать, используя различные порядки сортировки , либо в интерактивном режиме, либо через Lisp. И в отличие от ванильного Emacs, сортировка влияет как на *Completions*отображение, так и на цикл.)

Нарисовалась
источник
1
Так же, как комментарий в ответе abo-abo, я не могу полагаться на внешние пакеты. И ido-completing-readесть некоторые проблемы.
Ту До
2
Возможно, вы не можете, но, возможно, кто-то еще может. ;-) Это простое решение поставленной задачи: просто используйте completing-readс сосульками. Вы можете даже icicle-modeвременно включить (например, для вызова completing-read), используя, например, макрос icicle-with-icy-mode-ON.
Дрю