Answers:
* 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。]
给出completing-read一个列表列表,它将遵循顺序:
(completing-read "test: " '(("a") ("b") ("c")))
(completing-read "test: " '(("c") ("b") ("a")))
该文档字符串说:
(completing-read PROMPT COLLECTION &optional PREDICATEREQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)读取迷你缓冲区中的字符串,并带有完成内容。PROMPT是一个提示字符串;通常它以冒号和空格结尾。COLLECTION可以是字符串,列表,列表或哈希表的列表。...
因此,可以将清单作为集合。实际上,您正在创建一个包含键但没有值的列表。
我建议不要使用这个古老的咒语。
内置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"))))
ido-completing-read在于它具有^来自的奇怪的换行符semantic-format-tag-summarize。至于头盔,我不能认为每个人都使用它。这就是为什么completing-read唯一的选择。
semantic-format-tag-summarize给您的东西进行后处理。
ido
semantic-format-tag-summarize在末尾返回一些内容,但该字符未显示在completing-read或中helm-comp-read。我已经写了另一个函数来代替semantic-format-tag-summarize,没有面子。为了向用户显示标签(带有颜色),我仍然使用semantic-format-tag-summarize但使用带有文本小部件的自定义缓冲区。
semantic-format-tag-summarize回报后,我可能会向Ido提交错误。我有一个解决方案,但我仍然想知道一个解决方案completing-read。我知道Helm可以做到,但只是想知道是否completing-read存在一种简便的方法。
如果您使用Icicles,则顺序受completing-read。
(并且您可以交互地或通过Lisp 使用不同的排序顺序进行排序。与香草Emacs不同,排序会影响*Completions*显示顺序和循环顺序。)
ido-completing-read有一些问题。
completing-read与Icicles一起使用。您甚至可以使用macro icicle-mode临时打开(例如completing-read)icicle-with-icy-mode-ON。
icomplete遵守该顺序,则可以(cycle-sort-function . ,#'identity)在元数据列表中添加一个。